В. Столлингс - Операционные системы (1114679), страница 54
Текст из файла (страница 54)
Монитор поддерживает синхронизацию при помощи переменных условия, полагающихся (и доступных) только в мониторе. Работать с этими перемен„,ми могут две функции. с): приостанавливает выполнение вызывающего процесса по условию с. Монитор при этом доступен для использования другим процессом. ~"-:(~г.е11с): возобновляет выполнение некоторого процесса, приостановленного вызовом сже1г. с тем же условием. Если имеется несколько таких процессов, выбирается олин из них; если таких процессов нет, функция не делает ничего. Обратите внимание на то, что операции ие(Г/э1цпа1 монитора отличаются от соответствующих операций семафора. Если процесс в мониторе передает сигнал, но прн этом нет ни одного ожидающего его процесса, то сигнал просто теряется.
На рнс. 5.7 показана структура монитора. Хотя процесс может войти в монитор посредством вызова любой его процедуры, мы все же будем рассматривать монитор как имеющий единственную точку входа, которая позволяет обеспечить наличие в мониторе не более одного процесса в любой момент времени. Другие процессы, которые пытаются войти в монитор, присоединяются к очереди процессов, приостановленных в ожидании доступности монитора.
После того как процесс вошел в монитор, он может временно пРиостановиться, выполнив вызов ске1 (х); после этого процесс помещается в очередь процессов, ожидающих повторного входа в монитор при выполнении условия. Если процесс, выполняющийся в мониторе, обнаруживает изменение переменной Условия х, он выполняет операцию сэ1дпе1(х), которая сообщает об обна наруженном изменении соответствующей очереди. В кач качестве примера использования монитора вернемся к задаче производитель~пот е / Ребитель с ограниченным буфером. В листинге 5.15 показано решение задачи с нс использованием монитора.
Модуль монитора Ьаипс)ес)Ьиййег управляет буфером, исп Р, использующимся для хранения и получения символов. Монитор включает две пе переменные условий: псегы11 истинно, если в буфере имеется место как мин крайн, мум для одного символа, а погепрсу — если в буфере имеется по ней мере один символ. Часть 2. ° 5. П - - аРаллельные вычисления: взаимоисключения... l* Добавляем злемент е буфер +/ У* Возобновление работы потребителя ~ / Удаляем злемент из буфера */ Возобновляем работу производителей * р' Гехе1л = Ок яехдои~ =- Ор соил~ = О; Выкод "Ье='1л (ргос(нсег, солаог~ег) р жфсог Ьо.тс(ебЬ~ййег' ~аг Ьоййег(К): лехсфл пех1он~ Р сосок; ло~йо11, ло1етрСУ; /* Место для Ы злементоз Указатели буфера Количество злементоа з /* Синхронизация о1б аррепс)(сЬаг х) Часть .2; ' Рис.
5.7. Структура монитора истинг 5.15. Решение задачи производитель/потребитель с ограниче буфером с использованием монитора сиа1С (лоЬто11); н~1ее(оех11л) лехсфл = (лехсфл+1)%Кр сссл --~ ~' сзфдяа)(поСетрсу); (соылг == О) сна1Ь(ло~етрЬУ)р /* Ьы).йег(лехсоцЬ); сехеопс = (лех~опС+1) ФБр соелс /* се1ала1 (по~ йо11); /* ъ"03,(( ргосесег() сваг хр нЬ11е(сгие) ( ргобасе (х); аррелб(х); ~офб сслз~ж~ег ( ) сбаг хр ХЬ11е(~где) ( -а'ке(х) р ослабите(х)р '~'офс( д;а,(,) д ель может добавить символы в буфер только из монитора при ~роизво ите п(и проце Роц дуры аррелб; прямого доступа к буферу у него нет.
Сначала про- Р условие лоьЕы11, чтобы выяснить, имеется ли в буфере пустое Ра прове яет сли его нет, процесс приостанавливается, и в монитор может войти друол Р'цесс (и оизв ( р изводитель или потребитель). Позже, когда буфер оказывается вен не о д конца, приостановленный процесс извлекается из очереди и воздает свою ю работу. После того как процесс поместит символ в буфер, он б. П араллвльные вычисления взаимоисключения нализирует о выполнении условия па~ел;рбу, что разблокирует про оителя (если последний был приостановлен), Зтот пример иллюстрирует разделение ответственности при работе ~', ,ом и при использовании семафоров. Монитор автоматически обесп. имонсключение: одновременное обращение производителя и потре ~еру невозможно.
Однако программист должен корректно разместить.. ритора примитивы сыа1ь и св(жа1, для того чтобы предотвратить . элемента в заполненном буфере или выборку из пустого буфера. В: юльзования семафоров ответственность как за синхронизацию, так и зсключения полностью лежит на программисте. Обратите внимание, что в листинге 5.15 процесс покидает монитор ' (но после выполнения функции сэ(~па1. Если вызов са19па1 осущест ' в конце процедуры, то, по предложению Хоара, вызвавший эту ф инесс приостанавливается, для того чтобы освободить монитор для': ' зцесса, помещается в очередь и остается там до тех пор, пока монито ' освободится.
Процесс можно поместить во входную очередь монитора /гимн процессами, еще не вошедшими в монитор. Однако поскольку., ' чаемый процесс уже частично выполнил свою задачу в мониторе, име. ' ."ь этому процессу приоритет перед только входящими в монитор, для,',," тьзовать дополнительную, "срочную" очередь (см. рис. 5.7). Заметим, использующих мониторы языков, а именно Сопспггеп( Разса1„требу зов сз19лз1 был последней операцией процедуры монитора.
:.(( „ Если выполнения условия х не ожидает ни один процесс, вызов се~ выполняет никаких действий. Как при работе с семафорами, так и с мониторами очень легко :ибку в функции синхронизации. Например, если опустить любой из "' ) ала1 в мониторе, то процесс, попавший в соответствующую очередь, там навсегда. Преимущество мониторов по сравнению с семафор ~ все синхронизирующие функции заключены в мониторе.
Таким зверить корректность синхронизации и отловить возможные ошибки :я проще при использовании мониторов, чем при использовании се ' оме того, при правильно разработанном мониторе доступ к защище мам корректен независимо от запрашивающего процесса; при исп семафоров доступ к ресурсу корректен только в том случае, если и сработаны все процессы, обращающиеся к ресурсу. ониторы с оповещением и широковещанием Определение мониторов, данное Хоаром (НОАВ741, требует, чтобы ~и очередь ожидания выполнения условия не пуста, при выполнени$~,:. бо процессом операции сз19ла1 для этого условия был немедленно,. оцесс, находящийся в указанной очереди.
Таким образом, выполи цию =а' чпа1 процесс должен либо немедленно выйти из монитора, иостановленным. У такого подхода имеется два недостатка. (- Если выполнивший операцию са(опа1 процесс не завершил свое: ние в мониторе, то требуются два дополнительных переключения одно для приостановки данного процесса и второе для возобно работы, когда монитор станет доступен.
Планировщик процессов, связанный с сигналом, должен быть идеально надежен. При выполнении сэ)дла1 процесс из соответствующей очереди должен быть немедленно активизирован, причем планировщик должен гарантировать, что до активизации никакой другой процесс не войдет в монитор (в противном случае условие, в соответствии с которым активизируется процесс, может успеть измениться). Так, например, в листинге 5.15, когда выполняется сз(дпа1(пс~епрьу), процесс из очереди попетр у должен быть активизирован до того, как новый потребитель войдет в монитор. Вот и другой пример: сбой процесса производителя может произойти непосредственно после того, как он добавит символ к пустому буферу, так что операция сз19пз1 не будет выполнена.
В результате процессы в очереди поЬе~лрЬу окажутся навечно заблокированными. )1ястинг 5.16. Код монитора Ъоипйес3Ъп ГЕН 1е (соппЬ =-= К) с аз ~ ':" (по1 Гы11 ), Ь"1(ех (лехЬЫ) = х; пех „хл =' ( сехс ~о+1 ) со пс~-+; с! о"' 1 Г у ( псс епр1. у); 4((; /' Добавляем элемент в буфер /* уведомляем потребителя "'/ 1;Ь'- " *'1) е (сопл~ 9) с~~а 1 "- ( по1 еГйр Ь у ) (пехбоп(+ ссппЬ вЂ . (. ~ ":у (поЬтп11); 1) Ы"; у * удаляем элемент кэ буфера + / /+ уведомляе~ произаслителл "/ дэмпсон (Ьатрзоп) и Ределл (Вейе11) разработали другое определение монитора для языка Меаа (1 АМР801.
Их подход позволяет преодолевать описанные проблемы, а кроме того, предоставляет ряд полезных расширений концепции мониторов. Структура монитора Меза использована и в языке программирования Мойи)а-3 (ХЕ1Л9Ц. В языке программирования Меза примитив сз1()пз1 заменен примитивом спосьйу, который интерпретируется следующим образом. Когда процесс, выполняющийся в мониторе, вызывает споь((у (х), об этом оповещается очередь условия х, но выполнение вызвавшего спо" 11у процесса продолжается. Результат оповещения состоит в том, что процесс в начале очереди условия возобновит свою работу в ближайшем будущем, когда монитор окажется свободным.