Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Монитор — это набор процедур, переменных и структур данных. Процессы могут вызывать процедуры монитора, но не имеют доступа к внутренним данным монитора. Мониторы имеют важное свойство, которое делает их полезными для достижения взаимного исключения: только один процесс может быть активным по отношению к монитору. Компилятор обрабатывает вызовы процедур монитора особым образом. Обычно, когда процесс вызывает процедуру монитора, то первые несколько инструкций этой процедуры проверяют, не активен ли какой-либо другой процесс по отношению к этому монитору. Если да, то вызывающий процесс приостанавливается, пока другой процесс не освободит монитор. Таким образом, исключение входа нескольких процессов в монитор реализуется не программистом, а компилятором, что делает ошибки менее вероятными.
Соблюдение условия выполнения только одного процесса в определённый момент времени позволяет монитору обеспечить взаимоисключения. Данные монитора доступны в этот момент только одному процессу, следовательно, защитить совместно используемые структуры данных можно, просто поместив их в монитор. Если данные в мониторе представляют некий ресурс, то монитор обеспечивает взаимоисключение при обращении к ресурсу.
На основании данного определения монитора легко реализовать функции входа в критическую секцию (enter) и выхода из критической секции (leave) для произвольного числа конкурирующих процессов.
monitor {
boolean flag=false; /* флаг занятости ресурса */ queue S; /* очередь ожидания */
enterO { if(flag==true) wait(S); flag=true; }
leave() { flag=false; signal(S); /* разбудить ожидающие процессы */ } }
Как можно видеть, для эффективной реализации монитора необходимы системные примитивы wait() и signalQ, позволяющие организовать ожидание процессом наступления события «ресурс свободен» и возобновление процесса при наступлении этого события. Причём, примитив wait () выводит процесс из монитора, и для продолжения работы процесс должен снова пытаться войти в монитор (в функцию enter()). Этим обеспечивается возможность взаимоисключения для любого количества процессов.
Дата публикования: 2015-02-03; Прочитано: 1070 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!