Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС / Тема_2.ppt
Скачиваний:
202
Добавлен:
11.04.2015
Размер:
3.19 Mб
Скачать

Описание структуры и функциональной схемы

монитора

Внутренние данные монитора могут быть либо глобальными (относящимися ко всем процедурам монитора), либо локальными (относящимися только к одной конкретной процедуре). Ко всем этим данным можно обращаться только изнутри монитора. Процессы, находящиеся вне монитора только вызывают его процедуры, и не могут получить прямой доступ к данным монитора. При первом обращении (либо при создании) монитор присваивает своим переменным начальные значения. Значения глобальных переменных монитора сохраняются между обращениями.

131

Операционные системы

Абстрактное описание структуры монитора:

monitor monitor_name

{

Описание глобальных переменных; void m1(…){

…………

}

void m2(…){

…………

}

…………….

void mn(…){

…………

}

{

блок инициализации внутренних переменных

}

}

132

Операционные системы

Абстрактное описание структуры монитора:

Здесь функции m1, m2, … mn представляют собой процедуры (функции члены) монитора, а блок инициализации глобальных (внутренних) переменных содержит операции, которые выполняются только один раз: при создании монитора или при самом первом вызове какой-либо процедуры до ее выполнения.

133

Операционные системы

Описание функционирования монитора

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

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

134

Операционные системы

Описание функционирования монитора

Чтобы гарантировать, что процесс, находящийся в ожидании некоторого ресурса, со временем получит этот ресурс, Хоар предложил, чтобы ожидающий процесс имеет более высокий приоритет, чем новый процесс, пытающийся войти в монитор. Это исключает голодание. Несколько позже Хансен предложил другой подход: разбудивший процесс покидает монитор немедленно после исполнения операции SIGNAL.

135

Операционные системы

Пример монитора Хоара

monitor Resourse

{

condition free; // условие - свободный boolean busy ; // занят

void REQUEST() // запрос

{

if(busy) WAIT (free); busy==true;

TakeOff();// выдать ресурс

}

void RELEASE()

{

TakeOn() ; // взять ресурс busy=false;

SIGNAL ( free );

}

{

busy=false;

}

}

136

Операционные системы

Пример монитора Хоара

 

Единственный ресурс динамически запрашивается и освобождается

процессами, которые обращаются к процедурам REQUEST (запрос) и

RELEASE (освободить). Если процесс обращается к процедуре

REQUEST в тот момент, когда ресурс используется, значение

переменной busy (занято) будет равно true, и процедура REQUEST

выполнит операцию монитора WAIT(free). Эта операция блокирует не

процедуру REQUEST, а обратившийся к ней процесс, который

помещается в конец очереди процессов, ожидающих, пока не будет

выполнено условие free (свободно).

 

Когда процесс, использующий ресурс, обращается к процедуре

RELEASE, операция монитора SIGNAL деблокирует процесс,

находящийся в начале очереди, не позволяя исполняться никакой

другой процедуре внутри того же монитора. Этот деблокированный

процесс будет готов возобновить исполнение процедуры REQUEST сразу

же после операции WAIT(free), которая его и блокировала. Если

операция SIGNAL(free) выполняется в то время, когда нет процесса,

ожидающего условия free, то никаких действий не выполняется.

 

Операционные системы

137

 

Реализация мониторов

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

Мониторы встречаются в таких языках программирования, как параллельный Евклид, параллельный Паскаль, Java и т.д.

138

Операционные системы

Решение задачи производитель-потребитель с помощью мониторов:

monitor ProducerConsumer

{

condition full, empty; int count;

void put()

{

if(count==N) wait(full); put_item();

count++;

if(count==1) signal(empty);

}

139

Операционные системы

Решение задачи производитель-потребитель с помощью мониторов:

void get()

{

if(count==0) wait(empty); get_item();

count--;

if(count==N-1) signal(full);

}

{

count=0;

}

}

140

Операционные системы