В. Столлингс - Операционные системы (1114679), страница 52
Текст из файла (страница 52)
3'. 5.103~ )лучить при использовании обобщенных семафоров 1именуемых Вфорами со счетчиками). Переменная и в этом случае является се. значение остается равным количеству элементов в буфере. Пре 'перь, что п и переписывании этой программы произошла оши ошибка,'- ° Р н. Это:,, гиии Бтдае1 ( е ) и э1диа1 (и) оказались взаимозамененнымн. зивести к тому, что операция эуаие1 (г ) будет выполняться в кри ~зделе производителя без прерывания потребителя или другого гого п .ля. Повлияет ли это на выполнение программы.
Нет, поскол У 'ль в любом случае должен ожидать установки обоих семафоро Фо ов пе >лжением работы. Пястинг 5.10. Решение задачи производитель/потребитель с исполъзованием семафоров Теп еперь предположим, что взаимозаменены операции ха1с(п) и хэ1г. (з). Этап х приведет к фатальным последствиям. Если пользователь войдет в критический аз е Раздел, когда буфер пуст (и.саииг = О), то ни один производитель не сможет о добавить данные в буфер и система окажется в состоянии взаимной блокировки. Эт . Это хороший пример тонкости работы с семафорами и сложности корректной ой Разработки параллельно работающих процессов.
А тепе ь ерь добавим к нашей задаче новое, достаточно реалистичное огра» амчение — к — конечность буфера. Буфер рассматривается нами как циклическое храни.и е с . ще (см. Рис. 5.5), при работе с которым значения указателей долж- НМ Выражаться Р ться по модулю размера буфера.
При этом выполняются следую- ~ВЕ УСЛОВИЯ. ,,-- - Параллельные вычисления: взаимоисключения... 5. тт этсга1 (и) ыаз Ь (и); ха1с (э); ьаке (); В1япа1 (э); айдпа1(е); сопзппе(); Ф ° ° ° б ~-„-.~ 1 и ( Ра" Ьесгп (Ргоопсег, сопзппег); Реализация семафоров жяэводитель 111е(~где) иЬ11е (1п == оцс) l* Бездействие *~'; ы = Ь(оп1); опс = (опт+1) $ и; /* Потребление элемента и */; /* Произаслстао элемента ч*/е ыЬ11е((1п+1) Ъп ==- опс) /* Бездействие У; Ь(1п) = ч; 1п = (З.п+1) % Ргобпсе()." матс(е)' ыайг.(з)' аррепс((); э1Япа1(з) ° ""' ' -'-' (тее).эе~ (з. Й1аЯ) ) Безлейстаие lе (а.соспг е О) Часть 2.
Ц Рис. б.б. Конечный циклический буфер длл задачи производитель/потребитель Функции производителя и потребителя при этом могут быть запи ' ~ющим образом (переменные 1п и опс инициализированы значением О". лоаребитель: ыЬ11е (сгпе) В листинге 5.11 приведено решение с использованием обобщен )в. Для отслеживания пустого места в буфере в программу добавлен истинг 5.11.
Решение задачи производитель|потребитель с ограниченным буфером жэг 1п~ зтзео1ЬВХ1ег --. ~" РазмеР буфера /; ее~ар)азоте я = 1; .вар)1оге п = О; апарпохе е = ЯткеогЬыййег~ отб Реобпсег() Как упоминалось ранее, главное условие корректности работы семафоров заключается в требовании атомарности операций иа1с и эьапа1. Один нз очевидных путей выполнения этого условия состоит в реализации семафоров в аппаратном или микропрограммном обеспечении. Если этот путь недоступен„применяются различные программные подходы. Суть проблемы заключается в реализации взаимных исключений.
в определенный момент времени работать с семафором посредством операций науа или з1опа1 может только один процесс. Следовательно, подойдет любая из рассматривавшихся программных схем, такая, как алгоритмы Деккера или Петерсона; но это может привести к определ~нным накладным расходам. Можно также использовать одну из схем поддержки взаимоисключений на аппаратном уровне.
Так, в листинге 5.12,а покакак можно использовать инструкцию проверки и установки значения. В этой Реализации, как и в листинге 5.7, семафор представляет собой структуру; о на днако теперь он включает новый целый компонент э. й1ац. Конечно, при таком способ ~~обе Реализации семафоров неизбежно пережидание занятости, но поскольку опера Рации ыа ' С и з)цпа1 относительно небольшие, время ожидания минимально. однопроцессорной системе можно воспользоваться запретом прерываний на вем выполнения операций иа1С и зйопа1, как предложено В листинг 5.1гб цнй „,,„','„ ° .
Повторимся еще раз — малое время ожидания занятости этих операзначает целесообразность применения предложенного подхода. листинг ". г о.12. Две возможные реализации семафоров а.) иаэс ат'- (е) яструкция проверки и установки '/ '., " Параллельные вычисления. "взаимоисключения... е1 ве в.г).вд = О; )вз.) ~в) и)-, ' 1е (Сев~ее~ ) в. ~1ад) ) /~ Бездействие *)~ Б.саыу'ге+а )в.сава~' <= 0) б) Запрет прерываний */ Запретить прерываниями ~ в. саой1 < О) Рис 56 Паримма рсмая )7аместить етат црацесс в в.
ацеие Зеблакираветь працесс е1Бе Разрешить прерывания; Вепре ить Брерыве иия; ъ.саапГ++; 'г. ~в.сацпс <= О) Часть 2...,. )заместить етат процесс в в.аиеие Зе Ол скирава ть лрацесс и уста Навить е. Г)йс рйвньъ~ О 1 Уделить працесс Р из е.спеце Раместить Р в сцисак активных црацессав в.~Хам = 0; Улалить црацесс Р ие е.диеие заместить Р в списак активных працессав Разрешить прерывания~ адача о парикмахерской В качестве другого примера использования семафоров для реал итлельных вычислений рассмотрим простую задачу о парикмахерск, эимер весьма поучителен, так как задача, возникающая р п и поп ~ Я признателен профессору Ральфу Хильиеру (Виара Нпзес) из У тата Калифорния е Чика за предоставление зтой задачи.
„пть простой доступ в парикмахерскую, сродни тем, которые возникают в рельных операционных системах. В нашей парикмахерской три кресла, три парикмахера, зал ожидания, в котором четыре клиента могут разместиться на диване„а остальные — стоя (см. пс. 5.6). Правила пожарной безопасности ограничивают общее количество кли„д.ав внутри помещения 20 людьми. В нашем примере мы предполагаем, что всего мастерская должна обслужить 50 клиентов. Клиент не может войти в парикмахерскую, если она полностью заполнена другими клиентами. Оказавшись внутри, клиент либо присаживается на диван, либо стоит„если последний занят. Когда парикмахер освобождается, к нему отправляется наиболее долго ожидающий клиент с дивана; если имеются стоящие алненты, то тот из них, кто ожидает дольше других, присаживается на диван. По окончании стрижки принять плату может любой парикмахер, но так как кассир в парикмахерской лишь один, плата принимается в один момент времени только от одного клиента.
Рабочее время парикмахера разделяется на стрижку, принятие оплаты от клиента и сон в своем кресле в ожидании очередного клиента. Неполное решение задачи о парикмахерской В листинге 5.13 показана реализация парикмахерской с использованием семал, ~афоров; предполагается, что все очереди семафоров обрабатываются по прин- первым вошел — первым вышел". В листинге для экономии места функции " Расположены в два столбца. Основное тело программы активизирует процессы 50 клиентов, трех парикЖахс знр Ров н одного кассира. Рассмотрим теперь назначение различных синхрониРующих операторов.
1 местимость парикмахерской и дивана. Вместимость парикмахерской и дивана управляется семафорами пах сарас).~у и ваГа, соответственно. аждый раз при попытке клиента войти в парикмахерскую значение семафора пах сарас).су уменьшается на 1; когда клиент покидает парикмахер- , а 5. Параллельные вычисления: взаимоисключения.. скую, оно увеличивается. Если парикмахерская заполнена, то про ента приостанавливается функцией иа1» (пах сарас(»у).
Аналоги рабатывается и попытка присесть на диван. Емкость парикмахерских кресел. В наличии имеются три парикм крес. - есла, и следует обеспечить их корректное использование. ьагьег сФьа г гарантирует одновременное обслуживание не более трь»', ентов, так чтобы один клиент не оказался на коленях у другого. Кл. поднимется с дивана до тех пор, пока не окажется свободным хотя б т' кресло (вызов иа(т (ЬагЬег сйат г) ), а каждый парикмахер сааб ' том, что его кресло освободилось (вызов е)тдт1а1 (ЬагЬег спауг) ).
С " ливый доступ к парикмахерским креслам гарантируется организаци' редей семафоров: клиент, который первым блокирован в очереди, же и приглашается на стрижку. Заметим, что если в процедуре кли зов ъа1» (ЬагЬег с)~а(г) разместить после е1дпа1(войа), то квжд ' ент будет только присаживаться на диван, после чего немедленно вать и занимать стартовую позицию у кресла, создавая излишнюю ню и мешая работать парикмахеру. Размещение клиента в кресле. Семафор спа» геас(у обеспечивает спящего парикмахера, сообщая ему о новом клиенте. Без этого ае ' парикмахер никогда не отдыхал бы и приступал к стрижке неме сле того, как очередной клиент покинет кресло. При отсутствии этот момент парикмахер стриг бы воздух.
Ъ Удержание клиента в кресле. Если уж клиент оказался в кресле, - ' жен отсидеть там до окончания стрижки, о чем просигнализирует ЙьпуаЬео. Ограничение количества клиентов в креслах. Семафор ЬагЬег сЬа1г' значен для ограничения количества клиентов в креслах — их не до. ' ' более трех. Однако одного семафора ЬагЬег сЬа(г для этого не Клиент, который не получит процессорное время непосредственно п как парикмахер сообщит о завершении работы над его прич з(т1па1(г1п1аЬеб) ), останется в кресле (например, впав в транс или': задумавшись о задаче о парикмахерской), в то время как в этом же дет стараться устроиться новый клиент. Для решения данной задачи ется семафор 1еаъе Ь спа1г, который не позволяет парикмахеру нового клиента до тех пор, пока предыдущий не покинет кресло.
Оплата стрижки. Естественно, с деньгами надо быть особенно Кассир должен быть уверен, что каждый клиент, покидая пар сперва расплатится, а каждый клиент, оплатив стрижку, должен по Зто достигается передачей денег кассиру из рук в руки — каждый кинув кресло, оплачивает услуги парикмахера, после чего дает знать,:„ кассиру (вызов эгопа1(рауптепг)) и дожидается получения ка (вызов иа1» (гасе(р») ), Кассир осуществляет прием платежей, ожидая' о платеже, принимая деньги, а затем сообщая об этом.
Здесь следует ся избежать ряда программных ошибок. Если вызов з1()па1 (раутттепс -: няется непосредственно перед вызовом рау(), то клиент может ок рванным в этот момент, и кассир будет пытаться принять не перед д нствии кассира и парикмахера. В целях экономии средств парикмахерская не нанимает отдельного кассира. Это действие выполняет парикмахер, когда не стрижет клиента. Для того чтобы обеспечить выполнение парикмахером в один момент времени только одной функции, используется семафор соого. Назначение каждого семафора программы указано в табл.