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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!