Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LK_KMPS.DOC
Скачиваний:
8
Добавлен:
23.04.2019
Размер:
1.34 Mб
Скачать

2.34Блок gather

Блок GATHER имеет следующий формат записи:

GATHER <A>

Блок GATE накапливает заданное число сообщений, принадлежащих к одному семейству. Ни одно из накапливаемых сообщений не уничтожается. Когда в блоке GATHER накопится заданное число сообщений, все эти сообщения одновременно попытаются войти в следующий по номеру блок. Сообщения никогда не задерживаются на входе блока GATHER. Одновременно в одном блоке GATHER может происходить накопление сообщений нескольких семейств.

При входе сообщения в блок GATHER, интерпретатор просматривает семейство, к которому оно принадлежит, и проверяет, находится ли в данном блоке GATHER другое сообщение из того же семейства.

Поле А задает число сообщений, принадлежащих к одному семейству, которое нужно накопить. Операнд А может быть именем, положительным целым, СЧА, СЧА*<параметр>. Если вычисленное значение счетчика накапливания нулевое или отрицательное, происходит ошибка выполнения. Начальное значение счетчика должно быть больше или равно единице. Если в блок GATHER не вошло заданное число сообщений, сообщения, находящиеся в блоке, остаются в состоянии синхронизации.

Если первое сообщение является единственным членом семейства, происходит ошибка выполнения.

При входе первого из накапливаемых сообщений в блок GATHER

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

Счетчики Nj и Wj блока GATHER увеличиваются на единицу. Индикаторы списков устанавливаются в "0", а индикатор синхронизации устанавливается в единицу. Затем интерпретатор переходит к обработке следующего сообщения в списке текущих событий.

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

Сообщение включается в список накапливаемых сообщений, где сообщения располагаются в порядке поступления (первым входит, первым выходит). Счетчики Nj и Wj увеличиваются на единицу. Если значение числа накапливаемых сообщений после вычитания единицы стало равным нулю, все накапливаемые сообщения возвращаются в список текущих событий, и каждое из них становится последним среди сообщений с таким же значением приоритета. Сообщения возвращаются в список текущих событий в следующем порядке:

  • первым возвращается в список текущих событий первое из накапливаемых сообщений;

  • остальные накопленные сообщения возвращаются в список текущих событий в том порядке, в каком они поступили в блок GATHER.

Последним возвращается сообщение, при входе которого в блок GATHER значение счетчика стало равным нулю.

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

Сообщения, прерванные в блоке GATHER

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

Вход прерванных сообщений в блок GATHER

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]