Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Мониторы ресурсов и реализация взаимоисключения на мониторах



Монитор — это набор процедур, переменных и структур данных. Процессы могут вызывать процедуры монитора, но не имеют доступа к внутренним данным монитора. Мониторы имеют важное свойство, которое делает их полезными для достижения взаимного исключе­ния: только один процесс может быть активным по отношению к мо­нитору. Компилятор обрабатывает вызовы процедур монитора осо­бым образом. Обычно, когда процесс вызывает процедуру монитора, то первые несколько инструкций этой процедуры проверяют, не ак­тивен ли какой-либо другой процесс по отношению к этому монитору. Если да, то вызывающий процесс приостанавливается, пока другой процесс не освободит монитор. Таким образом, исключение входа нескольких процессов в монитор реализуется не программистом, а компилятором, что делает ошибки менее вероятными.

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

На основании данного определения монитора легко реализовать функции входа в критическую секцию (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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...