Читайте также:
|
|
Монитор — это набор процедур, переменных и структур данных. Процессы могут вызывать процедуры монитора, но не имеют доступа к внутренним данным монитора. Мониторы имеют важное свойство, которое делает их полезными для достижения взаимного исключения: только один процесс может быть активным по отношению к монитору. Компилятор обрабатывает вызовы процедур монитора особым образом. Обычно, когда процесс вызывает процедуру монитора, то первые несколько инструкций этой процедуры проверяют, не активен ли какой-либо другой процесс по отношению к этому монитору. Если да, то вызывающий процесс приостанавливается, пока другой процесс не освободит монитор. Таким образом, исключение входа нескольких процессов в монитор реализуется не программистом, а компилятором, что делает ошибки менее вероятными.
Соблюдение условия выполнения только одного процесса в определённый момент времени позволяет монитору обеспечить взаимоисключения. Данные монитора доступны в этот момент только одному процессу, следовательно, защитить совместно используемые структуры данных можно, просто поместив их в монитор. Если данные в мониторе представляют некий ресурс, то монитор обеспечивает взаимоисключение при обращении к ресурсу.
На основании данного определения монитора легко реализовать функции входа в критическую секцию (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-07-20; просмотров: 43 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Алгоритмы взаимоисключения Деккера и Петерсона. | | | Реализация взаимоисключения на аппаратном уровне |