Параллельное программирование: Учебное пособие, страница 46

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

2.4.6  Сообщения, как инструмент взаимодействия процессов

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

Для языка программирования высокого уровня, ориентированного на параллельное программирование вычислительных задач, можно в качестве средств меж процессной коммуникации выбрать и менее общий механизм реализации взаимодействия, например, механизм передачи и прохождения сообщений. Для этих целей в языках высокого уровня вводят специальную конструкцию структурирования данных, которую называют буфером. С ее помощью специфицируют межпроцессные буферы, предназначенные для занесения в них объектов типа сообщение(message). Например, описание

varbriefcase: buffer[5] ofmessage ;

приведет к созданию буфера с именем briefcase, в котором можно хранить до пяти объектов типа message. Один процесс может послать другому процессу сообщение с помощью предопределенной процедуры

send(х, briefcase, р)   ,

где     х – именует значение типа message;

briefcase – имя буфера, используемого для связи двух процессов;

р – приоритет сообщения.

Процесс может получить сообщение, обратившись к предопределенной процедуре

receive(х, briefcase)   .

Сам буфер может быть организован в виде очереди FIFO (первый пришел – первый ушел). Приоритет указывается для каждого присылаемого в буфер сообщения. Упорядочение по приоритету дает возможность срочным сообщениям перемещаться в начало очереди. Размер буфера выбирается с учетом необходимости удовлетворить различные требования. Если буфер заполнен, то обратившийся к процедуре sendпроцесс будет приостановлен до тех пор, пока некоторый другой процесс не удалит из буфера сообщение. Желательно, чтобы размер буфера выбирался так, чтобы ожидание происходило как можно реже. Аналогично, если буфер оказывается пустым, то приостанавливается процесс, обратившийся к процедуре receive, до тех пор, пока в буфер не будет прислано сообщение. Задавая размер буфера равным 1, мы тем самым получаем возможность работать с примитивом передачи сообщений, обеспечивающим одновременно с взаимодействием и синхронизацию.

Приведенное описание основной идеи метода передачи сообщений в практических системах дополняется многими другими возможностями, например, такими, как возможность получения одного сообщения из множества сообщений с различных буферов (недетерминизм), возможность ограничения доступа к буферу для специфицированных процессов и другие. Главным достоинством системы передачи сообщений является практическое решение вопроса взаимодействия процессов, если взаимодействие процессов ограничивается только передачей сообщений.

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