The design of the UNIX Operating System 32 страница



 

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

 

Реализация мониторов и передачи сообщений с помощью семафоров

 

Рассмотрим сначала, как реализовать мониторы с помощью семафоров. Для этого нам нужно уметь реа-лизовывать взаимоисключения при входе в монитор и условные переменные. Возьмем семафор mutex с начальным значением 1 для реализации взаимоисключения при входе в монитор и по одному семафору ci для каждой условной переменной. Кроме того, для каждой условной переменной заведем счетчик fi для индикации наличия ожидающих процессов. Когда процесс входит в монитор, компилятор будет генери - ровать вызов функции monitor_enter, которая выполняет операцию P над семафором mutex для данного монитора. При нормальном выходе из монитора (то есть при выходе без вызова операции signal для ус-ловной переменной) компилятор будет генерировать вызов функции monitor_exit, которая выполняет операцию V над этим семафором.

 

Для выполнения операции wait над условной переменной компилятор будет генерировать вызов функции wait, которая выполняет операцию V для семафора mutex, разрешая другим процессам входить в мони-тор, и выполняет операцию P над соответствующим семафором ci, блокируя вызвавший процесс. Для выполнения операции signal над условной переменной компилятор будет генерировать вызов функции signal_exit, которая выполняет операцию V над ассоциированным семафором ci (если есть процессы, ожидающие соответствующего события), и выход из монитора, минуя функцию monitor_exit.

 

Semaphore mutex = 1;

 

void monitor_enter(){ P(mutex);

 

}

 

void monitor_exit(){ V(mutex);

 

}

 

Semaphore ci = 0; int fi = 0;

 

void wait(i){

 

fi=fi + 1; V(mutex);

P(ci);

fi=fi - 1;

}

 

void signal_exit(i){ if (fi)V(ci); else V(mutex);


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

}

 

Заметим, что при выполнении функции signal_ exit, если кто-либо ожидал этого события, процесс покида-ет монитор без увеличения значения семафора mutex, не разрешая тем самым всем процессам , кроме раз-буженного, войти в монитор. Это увеличение совершит разбуженный процесс , когда покинет монитор обычным способом или когда выполнит новую операцию wait над какой-либо условной переменной.

 

Рассмотрим теперь, как реализовать передачу сообщений, используя семафоры . Для простоты опишем реализацию только одной очереди сообщений . Выделим в разделяемой памяти достаточно большую об-ласть под хранение сообщений, там же будем записывать, сколько пустых и заполненных ячеек находит-ся в буфере, хранить ссылки на списки процессов, ожидающих чтения и памяти. Взаимоисключение при работе с разделяемой памятью будем обеспечивать семафором mutex. Также заведем по одному семафо-ру ci на взаимодействующий процесс, для того чтобы обеспечивать блокирование процесса при попытке чтения из пустого буфера или при попытке записи в переполненный буфер . Посмотрим, как такой меха-низм будет работать. Начнем с процесса, желающего получить сообщение.

 

Процесс- получатель с номером i прежде всего выполняет операцию P(mutex), получая в монопольное владение разделяемую память. После чего он проверяет, есть ли в буфере сообщения. Если нет, то он за-носит себя в список процессов, ожидающих сообщения, выполняет V(mutex) и P(ci). Если сообщение в буфере есть, то он читает его , изменяет счетчики буфера и проверяет, есть ли процессы в списке процес-сов, жаждущих записи. Если таких процессов нет, то выполняется V(mutex), и процесс -получатель выхо-дит из критической области. Если такой процесс есть (с номером j), то он удаляется из этого списка, вы-полняется V для его семафора cj, и мы выходим из критического района. Проснувшийся процесс начина-ет выполняться в критическом районе, так как mutex у нас имеет значение 0 и никто более не может по-пасть в критический район. При выходе из критического района именно разбуженный процесс произве-


Дата добавления: 2021-01-21; просмотров: 123; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!