События
Определение. Событие – это логический сигнал (оповещение), приходящий асинхронно по отношению к течению процесса. С каждым событием связаны булевская переменная Е, принимающая два значения 0 - событие не пришло, и 1 - событие пришло, и очередь ожидания (процессов, задач, ожидающих прихода события). Над событиями определены следующие элементарные операции:
Send(E) – послать событие, т.е. установить переменную Е в 1, при этом все задачи из очереди ожидания активизируются;
Wait(E) – ожидать события, (если события нет, т.е. переменная Е равна 0, то эта операция переводит задачу в состояние ожидания прихода события, и добавляет ее в конец очереди ожидания этого события, как только событие придет, задача будет активизирована);
Reset(E) – очистить (удалить поступившее событие), т.е. установить переменную Е в 0;
Почтовые ящики
Определение. Почтовые ящики – это объект обмена данными между задачами, устроенный в виде очереди FIFO. С каждым почтовым ящиком связаны:
Очередь сообщений (образующая содержимое почтового ящика).
Очередь задач, ожидающих сообщений в почтовом ящике.
Очередь задач, ожидающих освобождения места в почтовом ящике.
Механизм взаимного исключения, обеспечивающий правильный доступ нескольких задач к одним и тем же сообщениям в почтовом ящике.
Количество задач, ожидающих сообщения в почтовом ящике, обычно не ограничено. Количество же сообщений в ящике обычно ограничено параметром, указанным при создании ящика. Это связано с тем, что размер каждого сообщения указывается при создании ящика и может быть значительным. Если ящик полон и задача пытается поместить в него новое сообщение, то она блокируется до тех пор, пока в ящике не появится свободное место. Над почтовыми ящиками определены следующие элементарные операции:
положить сообщение в почтовый ящик (если в ящике нет свободного места, то задача, вызвавшая эту операцию, может быть блокирована и помещена в очередь задач, ожидающих освобождения места в ящике);
попробовать положить сообщение в почтовый ящик - если в ящике есть свободное место, то эта операция эквивалентна положить, иначе вернуть признак отсутствия места;
положить в начало – то же, что положить, только сообщение помещается в голову очереди;
попробовать положить в начало – то же, что попробовать положить, только сообщение помещается в голову очереди;
взять сообщение из почтового ящика (если в ящике нет сообщений, то задача, вызвавшая эту операцию, может быть блокирована и помещена в очередь задач, ожидающих сообщения);
попробовать взять сообщение из почтового ящика – если в ящике есть сообщения, то эта операция эквивалентна взять, иначе вернуть признак отсутствия сообщений;
очистить ящик - удалить все сообщения из очереди.
Фактически описанный механизм представляет собой взаимодействие клиент-сервер, когда задачи-клиенты помещают запросы в почтовый ящик, а задачи-серверы их оттуда забирают.
