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