Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / СПО2.doc
Скачиваний:
114
Добавлен:
11.02.2014
Размер:
527.87 Кб
Скачать

20. Мониторы хоара. Почтовые ящики, конвейеры, тупики. Мониторы хоара.

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

Поэтому разработали мониторы Хоара.

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

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

Откажет в нем. Если ресурс занят, то процедура монитора выдает команду ожидание WAIT с указанием условия ожидания.

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

Пример монитора Хоара:

monitor resourse;

conolition free; { условие свбодный}

var busy: Boolean { busy - занят}

procedure REQUEST;

begin

if busy then WAIT (free);

busy:=true;

take off; {выдать ресурс}

end;

procedure RELEASE;

begin

take on;

busy:=false;

SIGNAL (free)

end;

begin

busy:=false;

end.

Ресурс динамически запрашивается и освобождается процессами, которые обращаются к процессу REQUEST и RELEASE. Если PR обращается к REQUEST в тот момент, когда ресурс используется, busy:=true и REQUEST выполняет операцию монитора WAIT (free). Эта операция блокирует процесс, обратившихся к процедуре REQUEST. Процесс помещается в конец очереди процессов, ожидающих, пока не будет выполнено условие free.

Когда PR, использует ресурс и обращается к RELEASE, операция монитора SIGNAL деблокирует процесс, находящийся в начале очереди, не позволяя, исполнятся никакой другой процедуре внутри того же монитора. Если SIGNAL выполняется в то время, когда нет процесса, ожидаемого условия вне, то никакие действия не выполняются.

Почтовые ящики

Для хранения посланного, но ещё не полученного сообщения необходимо место – буфер сообщений (почтовый ящик).

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

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

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

Реализация – с помощью примитивных операторов P и V, или с помощью процедур:

- SEND_MESSAGE (получать, сообщение, буфер)- переписать сообщение;

- WAIT_MESSAGE (отправитель, сообщение, буфер) – блокировать процесс и т.д., пока в очереди не появится сообщение и т.д.

Соседние файлы в папке лекции