Метод семафоров применяют в задачах, которые называются «производитель – потребитель» и «писатель – читатель».
Эти задачи связаны с работой с буферными пулами. Предложил математик Дейстра Семафор, использовал действия переменных, которые принимали значение целых чисел.
Для работы с семафорами используются два примитива: V и P.
1. V(S) – операция, увеличивающая переменную S на 1. S:=S+1, причем выборка, наращивание и запоминание должно выполняться единой *, чтобы не было прерываний.
2. P(S) – уменьшение переменной на единицу S:=S-1.
В первом случае, применение операции V невозможно, если буфер полон. Во втором случае применение операции P не возможно, если буфер пуст.
В частном случае семафоры могут быть двоичными, превращаться в блокирующую переменную или мьютекс.
Пусть буферный пул состоит из N буферов, каждый буфер содержит одну запись. Пусть процессор писатель записывает, читатель – читает. Интенсивности процессов разные или переменные.
Скорость записи может превышать скорость чтения, и наоборот.
Когда буферы будут заполнены необходимо приостановить процесс *, когда буферы будут пусты – приостановить чтение.
Для синхронизации применяют 2 буфера
e – число пустых буферов e=N,
f – число полных буферов f=0,
N – число буферов.
e и f – представляют число полных и пустых буферов, -это два счётчика, тогда операция: P(e)-уменьшение числа пустых буферов; V(e)- увеличение числа пустых буферов; P(f)- уменьшение числа полных буферов; V(f)- увеличение числа полных буферов.
Процессов “писателей”, “читателей” может быть множество- это может привести к конфликту при доступе, могут несколько процессов “писателей”, “читателей” войти в критическую секцию.
Для этого необходима операция записи и чтения из буфера, необходимо уст.* блоки переменную b. Необходимо произвести операцию P(b), если Р=0, то b установить в 1, и применить операцию V(b) –освободить ресурс.
Проанализировать ситуацию если Р(b)- в начало, а V(b) в конец, не приведёт ли эта операция к блокировке (RICH).
Условная синхронизация применяется в тех случаях, если выполнение некоторого процесса cзависит от результата выполнения процессов Аи В.
Условная синхронизация может производиться как в пользовательском пространстве так и в пространстве ядра. Имеется несколько процессов A,B,C,D. Которые взаимосвязаны между собой. Процессы не могут переступить барьер до тех пор пока все они не достигнут его.
В этом случае выполнение процесса делится на фазы, имеется четыре процесса. На второй фазе три процесса достигли барьера и выполняют примитив барьер путём системного вызова, после чего процесс приостанавливается. Когда последний процесс достигнет барьера то они не переходят в следующую фазу (3).