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

Если получится так, что процесс А выдаст заявку на передачу первым, то его выполнение будет приостановлено до тех пор, пока процесс В не выдаст заявку на получение. Аналогично, если первым выдаст заявку на получение процесс В, то он также будет приостановлен до тех пор, пока процесс А не выдаст заявку на передачу. Как только за счет приостановки одного из процессов обе заявки процессов во времени совпадут, то есть, достигнут точки синхронизации, то начнется выдача (генерация) данных одним процессом и запись этих данных в локальную память другого процесса. После этого канал связи уничтожается, и каждый из процессов возобновляет свою деятельность.

Такая синхронизация двух процессов несколько позднее (в языке АДА) была названа рандеву. Передача данных между процессами в первоначальном варианте рандеву по Хоару происходила без использования какого-либо буфера. На время перемещения данных использовался лишь канал связи с уникальным логическим именем. Эта модель рандеву реализовала взаимодействие процессов симметрично в том смысле, что оба вступивших в общение партнера обрабатывались одинаково. Взаимное исключение в этой модели достигалось тем, что в параллельной программе с множеством процессов не допускалось существование больше одной пары команд передать-принять с одним и тем же логическим именем канала связи. Фактически такой обмен был подобен синхронизированному оператору присваивания, который активировался в момент совпадения заявок. Формально, чтобы состоялось рандеву, каждый процесс должен был назвать имя другого процесса. Это было существенным ограничением, порождавшим серьезную проблему. Проблема состояла в том, что оказалось невозможным создавать библиотеки общих процедур, обслуживающих процессы пользователя с неизвестными ему именами.

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

Асимметричная связь между процессом, поставляющим или генерирующим данные (процесс-хозяин), и процессом, который эти данные получает или использует (процесс-служащий), заключается в том, что для рандеву имя второго процесса, потребляющего данные, называет только процесс, создающий эти данные, то есть, процесс-хозяин. На рисунке 2.24 показаны активно синхронизируемые процессы А и В для случаев симметричного и несимметричного рандеву.

На рисунке 2.24а  оператор ch!xв процессе A означает выдачу значения данных хпроцессу В, а соответствующий оператор ch?ув процессе В означает получение некоторого значения данных от процесса А и хранение этого значения в у. Механизм (gear) синхронизации, обеспечивающий обоюдное отслеживание момента совпадения запроса на передачу и прием данных условно отражен на рисунке кружочком с именем канала ch.  Формально этот механизм может быть реализован на основе списка, в котором каждый процесс при выдаче своей заявки сначала ищет имя канала, названного в операторе, и, если имя там находится, то запускается процесс “мгновенной” пересылки данных, после чего имя удаляется из списка. Если же с выдачей заявки на передачу или прием имя канала в списке не обнаруживается, то имя канала помещается в список, а выдавший заявку процесс переводится в режим ожидания. “Мгновенности” передачи на самом деле не бывает, поэтому должны быть предусмотрены системные механизмы закрепления за начатым процессом физического канала связи на все время пересылки данных.


Рисунок 2.24