Семафоры.

Концепция семафоров была предложена Дейкстра. Семафор представляет собой целочисленную переменную 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 г.