Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операционные системы_лекции.doc
Скачиваний:
47
Добавлен:
28.09.2019
Размер:
1.71 Mб
Скачать

3.3.6. Мониторы

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

Более лучшее решение вопроса о взаимном исключении в 80-х гг. прошлого века предложил Ч. Хоар. Он предложил механизм мониторов. Монитором в параллельном программировании называют пассивный набор разделяемых переменных и повторно входимых процедур (см. раздел 1.6). Повторно входимые процедуры обеспечивают доступ к разделяемым переменным. В каждый момент времени монитором может пользоваться только один процесс. Процедуры монитора исполняются только по требованию процессов.

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

Пример реализации простейшего монитора для выделения процессам одного ресурса показан на рис. 3.7 [1].

monitor Resource;

condition free;

var busy: boolean;

{заголовок описания монитора}

{условие ожидания – свободный}

{описание переменной занят}

Procedure REQUAEST;

begin

if busy then WAIT(free);

busy:=True;

TakeOff

end;

{заголовок процедуры Запрос ресурса}

{если монитор занят, то блокировать вызвавший} {процесс до сигнала Свободен}

{перевод монитора в состояние Занят}

{предоставить ресурс ожидающему процессу}

Procedure RELEASE;

begin

TakeOn;

busy:=False;

SIGNAL(free);

end;

{заголовок процедуры Освободить ресурс}

{взять предоставленный ресурс}

{освободить монитор}

{послать сигнал Свободен ожидающим процессам}

Рис. 3.7. Пример реализации простейшего монитора

Исполняющийся процесс запрашивает ресурс, вызывая процедуру REQUAEST. Если монитор занят (busy:=True), то процесс блокируется и ставится в очередь ожидания. Дальнейшее выполнение процедуры откладывается. Если монитор свободен, то он переводится в состояние "Занят" и предоставляет критический ресурс вызвавшему REQUAEST процессу.

Процесс, использующий ресурс, вызывает процедуру RELEASE, забирает его в своё пользование. Использовав ресурс, процесс переводит монитор в состояние "Свободен" и подаёт сигнал "Свободен" ожидающим процессам. Рано или поздно очередь пользования ресурсом дойдёт до отложенного процесса, по сигналу "Свободен" он снова сделает попытку вызывать REQUAEST и, в конце концов, получит в своё распоряжение критический ресурс.

По сравнению с семафорами мониторы имеют следующие преимущества:

  • высокая гибкость, т.е. способность мониторов приспосабливаться к новым задачам;

  • локализация разделяемых переменных и процедур внутри тела монитора, что позволит не применять сложные малопонятные конструкции в синхронизируемых процессах;

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

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