Решение задачи производителя-потребителя с помощью передачи сообщений

Теперь давайте рассмотрим, как с помощью передачи сообщений и без использования общей памяти может решаться задача производителя-потребителя. Решение этой задачи показано в листинге 2.12. Будем исходить из предположения, что все сообщения имеют один и тот же размер и что переданные, но еще не полученные сообщения буферизуются автоматически средствами операционной системы.
В этом решении всего используется N сообщений, что аналогично N местам в буфере, организованном в общей памяти. Потребитель начинает с того, что посылает N пустых сообщений производителю. Как только у производителя появится запись для передачи потребителю, он берет пустое сообщение и отправляет его назад в заполненном виде. При этом общее количество сообщений в системе остается постоянным, поэтому они могут быть сохранены в заданном, заранее известном объеме памяти.

Листинг 2.12. Решение задачи производителя-потребителя с помощью N сообщений #define N 100

void producer(void)

{

int item; message m;

while (TRUE) { item = produce_item( );

*/

receive(consumer, &m); build_message(&m, item); send(consumer, &m);

}

}

void consumer(void)

{

int item, i; message m;

for (i = 0; i < N; i++) send(producer, &m); /* отправка N пустых

сообщений */

while (TRUE) {


Если производитель работает быстрее потребителя, все сообщения в конце концов становятся заполненными, ожидая потребителя; производитель должен будет заблокироваться, ожидая возвращения пустого сообщения. Если потребитель работает быстрее, то получается обратный эффект: все сообщения опустошатся, ожидая, пока производитель их заполнит, и потребитель заблокируется в ожидании заполненного сообщения.

Доступно множество вариантов передачи сообщений. Для начала рассмотрим способ адресации сообщений. Можно присвоить каждому процессу уникальный адрес и адресовать сообщения процессам. Можно также изобрести новую структуру данных, называемую почтовым ящиком. Этот ящик представляет собой место для буферизации конкретного количества сообщений, которое обычно указывается при его создании. При использовании почтовых ящиков в качестве параметров адреса в вызовах send и receive указываются почтовые ящики, а не процессы. Когда процесс пытается послать сообщение заполненному почтовому ящику, он приостанавливается до тех пор, пока из этого почтового ящика не будет извлечено сообщение, освобождая пространство для нового сообщения.

При решении задачи производителя-потребителя оба они, и производитель и потребитель, создадут почтовые ящики, достаточные для размещения N сообщений. Производитель станет отправлять сообщения, содержащие реальные данные, в потребительский почтовый ящик. При использовании почтовых ящиков механизм буферизации вполне понятен: в почтовом ящике получателя содержатся сообщения, посланные процессу- получателю, но еще не принятые им.

Другой крайностью при использовании почтовых ящиков является полный отказ от буферизации. При этом подходе, если операция send проводится до операции receive, процесс-отправитель блокируется до завершения операции receive, в это время сообщение может быть непосредственно скопировано с отправителя получателю без использования промежуточной буферизации. А если первой проводится операция receive, получатель блокируется до осуществления операции send. Такую стратегию обычно называют рандеву. Она проще в реализации, чем схема с буферизацией сообщений, но является менее гибкой, поскольку отправитель и получатель должны работать в строго предопределенном режиме.

Передача сообщений широко используется в системах параллельного программирования. В качестве примера можно привести общеизвестную систему передачи сообщений MPI (Message-Passing Interface). Она нашла широкое применение в научных вычислениях. Более подробные сведения об этой системе изложены в трудах Gropp et al., 1994; Snir et al., 1996.

2.3.9.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Решение задачи производителя-потребителя с помощью передачи сообщений:

  1. 3. Договоры о передаче исключительных прав производителя фонограммы
  2. 5. Договоры о передаче прав на средства индивидуализации товаров и их производителей
  3. ПЕРЕДАЧА АНГЕЛЬСКИХ СООБЩЕНИЙ
  4. 7.4.1. Помощь группы в получении сообщений
  5. 7.4.1. Помощь группы в получении сообщений
  6. 7. Каждый школьник – это сложнейший мир проблем и задач. Забота о своевременном решении этих проблем и задач составляет основу строительства новой школы
  7. ЗАДАЧА: РЕШЕНИЕ
  8. § 29 Передача и переход прав по обязательствам. – Римская конструкция права передачи. – Облегчение передачи новейшим законодательством. – Передаточная надпись. – Ограничения передачи. – Действие передачи. – Ответственность передатчика и права приобретателя. – Вступление в право кредитора или суброгация. – Русский закон передачи. – Передача заемных писем. – Переход требований к кредиторам.
  9. § 3. СТРУКТУРА РЕШЕНИЯ ПЕДАГОГИЧЕСКИХ ЗАДАЧ
  10. Психологические особенности решения задач.
  11. § 3. Мышление, интуиция, воображение в решении задач
  12. Правило подчинения общения решению задач правового воспитания.
  13. ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ПО РЕШЕНИЮ ПСИХОЛОГО-ПЕДАГОГИЧЕСКИХ ЗАДАЧ
  14. Прием достижения момента истины в решении задач разговора.
  15. юридико-психологические исследования решения разных правоохранительных задач
  16. § 1. ПОНЯТИЕ О ПЕДАГОГИЧЕСКОЙ ДЕЯТЕЛЬНОСТИ КАК ПРОЦЕССЕ НЕПРЕРЫВНОГО РЕШЕНИЯ ПРОФЕССИОНАЛЬНЫХ ЗАДАЧ
  17. Специфической особенностью творческих процессов решения задач является присутствие в них интуиции.