Var busy: Boolean;
Procedure Request; (* запрос*)
Begin
If busy then wait (free);
Busy := true;
Выдать ресурс;
End;
Procedure Release; (* освобождение*)
Begin
Взять ресурс;
Busy := false;
SIGNAL (free);
End;
Begin
Busy := false;
End.
Единственный ресурс динамически
запрашивается и освобождается процессами,
которые обращаются к процедурам RequestиRelease. Если процесс
обращается к процедуреRequestв тот момент, когда ресурс используется,
значение переменнойbusyбудетtrueиRequestвыполнит операциюWAIT(free).
Эта операция заблокирует обратившийся
процесс, и он будет помещён в конец
очереди процессов, ожидающих доступа
к монитору. Когда процесс, использующий
ресурс, обратится к процедуреRelease,
операция монитораSIGNALдеблокирует процесс, находящийся в
начале очереди, не позволяя исполняться
никакой другой процедуре внутри того
же монитора. Этот деблокированный
процесс готов возобновить выполнение
процедурыRequest.
Использование монитора в качестве
средства синхронизации и связи освобождает
процессы от необходимости явно разделять
между собою ресурсы, так как доступ к
разделяемым переменным всегда ограничен
телом монитора. Поскольку мониторы
входят в состав ядра ОС, то разделяемые
переменные становятся системными
переменными. Этот факт автоматически
исключает критические интервалы, так
как в каждый момент монитором может
пользоваться только один процесс.
Использование мониторов имеет ряд
преимуществ по сравнению с низкоуровневыми
средствами:
- локализация разделяемых переменных
внутри тела монитора позволяет избавиться
от малопонятных программных конструкций
в синхронизируемых процессах;
- мониторы дают возможность процессам
совместно использовать программные
модули, представляющие критические
секции (если несколько процессов
совместно и одинаково используют
некоторый разделяемый ресурс, то в
составе монитора достаточно иметь одну
копию соответствующей процедуры работы
с этим ресурсом).