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

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

Имеется несколько разновидностей двухточечного обмена:

·  синхронный обмен, который сопровождается уведомлением об окончании приема сообщения;

·  асинхронный обмен, который уведомлением не сопровождается;

·  блокирующие прием/передача, которые приостанавливают выполнение процесса на время приема сообщения (рис. 4.1);

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

Не блокирующий обмен требует аккуратности при использовании функций приема, так как такой прием завершается немедленно и для системы неважно, прибыло сообщение к месту назначения или нет. Убедиться в этом можно с помощью функций проверки получения сообщения. Обычно вызов таких функций размещается в цикле, который повторяется до тех пор, пока функция проверки не вернет значение "true", означающее успешное получение. После этого можно вызывать функцию приема сообщения из буфера, как показано на рис. 4.2.


Рисунок 4.1. Обмен с блокировкой


Рис. 4.2. Обмен без блокировки

Более разнообразной формой обмена является операция коллективногообмена. В нее вовлекаются не два, а большее число процессов. Разновидностями коллективного обмена являются:

·  широковещательная передача (трансляционный обмен)здесь один процесс передает сообщение всем остальным процессам;

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

·  операции приведениявходными являются данные нескольких процессов, а результат — одно значение, которое становится доступным всем процессам, участвующим в обмене.

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

Модель передачи сообщений может быть реализована тремя способами:

·  путем создания специализированного языка параллельного программирования;

·  путем расширения обычного последовательного языка включением в него средств обмена сообщениями;

·  путем использования специализированных библиотек в программах, написанных на обычных языках последовательного программирования.

Язык Occam, разработанный для транспьютерных систем, является примером первого подхода. Примерами второго подхода являются языки СС++ (Compositional C++ — расширение C++) и FORTRAN M (расширение языка FORTRAN). Третий подход базируется на специальных процедурах, разработанных с использованием сетевых команд в кодах своих программ.

Предлагается достаточно много библиотек передачи сообщений. Такие библиотеки разрабатываются под конкретные платформы и распространяются либо свободно, либо на коммерческих условиях. Под платформой обычно понимают сочетание архитектуры компьютера и установленной на нем операционной системы. Наиболее известны независимые от платформы библиотеки: PVM (Parallel Virtual Machine — "Параллельная Виртуальная Машина") и различные реализации MPI (Message Passing Interface). Примером библиотеки, которая зависит от платформы, может служить библиотека для вычислительной системы nCUBE. Базовый набор функций во всех библиотеках примерно одинаков.

4.3  MPI — Интерфейс Передачи Сообщений