![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Концепция семафоров была предложена Дейкстра. Семафор представляет собой целочисленную переменную S, с которой ассоциирована очередь ожидающих процессов. Пытаясь пройти через семафор, процесс одновременно вычитает из S единицу. Если S>=1 (семафор открыт), то процесс проходит сквозь семафор, если S=0 (семафор закрыт), то процесс останавливается и ставится в очередь.
Закрытие семафора соответствует захвату объекта или ресурса, доступ к которому контролируется этим семафором. Если объект захвачен, остальные процессы вынуждены ждать его освобождения. Закончив работу с объектом, процесс увеличивает значения семафора на единицу, открывая его. В простейшем случае работает двоичный семафор, который может быть либо нулем, либо единицей. Есть семафоры общего вида, принимающие любые целочисленные значения, соответствуют случаю, когда с объектом могут работать несколько процессов, разрешается добавлять и отнимать у S любое значение, есть реализации, у которых S<0, значение семафора можно читать и менять с помощью специальных операций, которые обозначаются Р и V, а также операцией инициализации Init Sem (Имя семафора, начальное значение). P(S): if S>0 then S:=S–1; else остановка процесса и помещение его в очередь ожидания. V(S): S:=S+1; активация одного из ожидающих процессов.
При отказе доступа к критическому ресурсу используется режим пассивного ожидания. Поэтому в состав механизма семафоров включаются средства формирования и обслуживания очередей. Эти средства реализуются супервизором ОС. Семафоры также можно использовать для реализации механизма синхронизации процессов путем блокирования возобновления: один процесс блокирует себя (выполняя операцию P(S) до начального значения S), чтобы подождать наступления некоторого события, другой процесс обнаруживает, что ожидаемое событие произошло, и возобновляет заблокированный процесс (с помощью V(S)).
Участки взаимоисключения обрамляются операциями P и V. Если одновременно несколько процессов попытаются выполнить V, то это будет разрешено только одному из них.
Program BinSemaphore
Var S: semaphore;
Procedure процесс1;
Begin
While true do
begin
P(S);
КритическийУчасток1;
V(S);
End; end;
Procedure процесс2;
Begin
While true do
Begin
P(S);
КритическийУчасток2;
V(S);
End; end;
BEGIN
Init Sem (S,1);
Par begin
Процесс1; процесс2;
Par end
END.
Пример считающих семафоров – взаимодействие двух, выполняющихся в режиме мультипрограммирования, потоков или процессов, один из которых пишет данные в буфер, а другой считывает их.
20 марта 2012 г.
Дата публикования: 2014-11-29; Прочитано: 420 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!