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

Рисунок 2.24б  демонстрирует реализацию несимметричного рандеву. Здесь операторы  приема и передачи заменены специальными процедурами, которым посредством механизма формальных параметров можно передать необходимые фактические параметры, в том числе и расширенное имя процесса получателя. Так, например, внутри процесса А данное х передается с помощью обращения к процедуре B.out(x). Внутри процесса В должен быть выполнен специальный оператор приема, который должен найти свое имя в списке получателей данных и, если таковое там есть, то инициировать процедуру out(y:=x), чтобы присвоить переменной  y значения переменной х. Названные процедуры процессов А и В  инициируют механизм рандеву, задерживая выполнение того или иного процесса, если одновременно обе процедуры еще не вызваны. Фактическая передача данных выполняется, как и при обычном вызове процедуры: фактические параметры в обращении к процедуре ставятся в соответствие формальным параметрам спецификации оператора приема. После завершения оператора приема оба процесса возобновляют свою самостоятельную деятельность.

Использование процедур для рандеву имеет следующие преимущества. Так как передача данных специфицируется с помощью параметров процедуры, то предоставляется возможность специфицировать любое число параметров, которые могут принадлежать классу in, out или inout. Это открывает возможность передачи данных в обоих направлениях. Во-вторых, тело оператора приема может выполняться эффективно как критический интервал благодаря тому, что операторы приема в нем строго локализованы. И третье, описанный механизм меж процессного взаимодействия сравнительно легок для понимания функционирования сложных параллельных программ, благодаря обязательной синхронизации процессов во времени.

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

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

1)  ожидание обращения на чтение;

2)  ожидание обращения на запись;

3)  ожидание обращения, как на чтение, так и на запись;

4)  нет обращений ни на чтение, ни на запись.

В случаях (1) и (2) немедленно выполняется соответствующий оператор приема. В случае (3) выбирается случайным образом один из двух операторов приема, который затем и выполняется. В случае (4) процесс приостанавливается до тех пор, пока не поступит запрос либо на чтение, либо на запись; и в момент поступления запроса выполняется соответствующий оператор приема. Таким образом, каждый раз при выполнении оператора выбора будет выполняться в точности одна процедура приема; но выбор самой процедуры и времени ее выполнения теперь будет зависеть от характера и последовательности обращений.

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