Особенности семафорных примитивов.
Атанов С.К., ЕНУ им.Л.Н.Гумилева Понятие семафорных механизмов было введено Дейкстрой.
Определение: cемафор – это переменная специального типа, доступная параллельным процессам для проведения над ней только двух операций – «закрытия» и «открытия», названных соответственно Р-операцией (P – от голландского Proberen – проверить) и V- операцией (V – от голландского Verhogen – увеличить).
Эти операции неделимы и являются примитивами относительно семафора, который указывается в качестве параметра операций. Обобщенный смысл примитива P(S) состоит в проверке текущего значения семафора S, и если оно не меньше нуля, то осуществляется переход к следующей за примитивом операции. В противном случае процесс снимается на некоторое время с выполнения и переводится в состояние «пассивного ожидания».
Операция V(S) связана с увеличением значения семафора на единицу и переводом одного или нескольких процессов в состояние готовности к центральному процессору.
На практике используется много различных видов семафорных механизмов, отличающихся начальным значением и диапазоном изменения значений семафора, логикой действия семафорных операций, количеством семафоров, доступных для обработки при использовании отдельного примитива. Допустимыми значениями семафора являются только целые числа. Если максимально возможное значение семафора равно 1, то семафор называется двоичным или мьютексом. В противном случае семафоры называют N-ичными. Возможны варианты реализации, в которых семафорные переменные не могут быть отрицательными, в других – отрицательные значения могут указывать на длину очереди процессов, стоящих в состоянии ожидания открытия семафора.
Программа, иллюстрирующая взаимное исключение двух параллельных процессов с помощью семафорных операций будет иметь следующий вид.
var S: semafor;
begin
InitSem(S, 1); {присвоить семафору S начальное значение 1}
parbegin {Р1}while true do begin
P(S);
CS1; {Критический интервал процесса Р1}
V(S);
end and
{Р2}while true do begin
P(S);
CS2; {Критический интервал процесса Р2}
V(S) end parend end.
Возможна различная реализации семафорных примитивов. Например, она может иметь следующий вид.
P(S): S:=S-1;
if S<0 then WAIT(S) {остановить процесс и поместить в очередь ожидания к семафору S}
V(S): if S<0 then RELEASE(S) {поместить один из ожидающих процессов очереди семафора S в очередь готовности};
S:=S+1
Неделимость Р- и V-операций в однопроцессорной вычислительной системе можно обеспечить с помощью простого запрета прерываний. В мультипроцессорных системах необходимо дополнительное аппаратное взаимное исключение доступа для различных процессоров, например, использование неделимых команд типа «проверка и установка»
(TS).
Основное достоинство использования семафорных операций – отсутствие состояния активного ожидания.