Семафорные примитивы Дейкстры

Семафор – переменная специального типа, которая доступна параллельным процессам для проведения над ней только двух операций: «закрытии» и «открытия», названных соответственно P - и V -операциями. Эти операции являются примитивами относительно семафора, который указывается в качестве параметра операции. Здесь семафор выполняет роль вспомогательного критического ресурса, так как операции P и V неделимы при своем выполнении и взаимно исключают друг друга.

Основным достоинством семафорных операций является отсутствие состояния «активного ожидания», что повышает эффективность работы мультипрограммной вычислительной системы.

В настоящее время используют много различных семафорных механизмов. Варьируемыми параметрами, которые отличают различные виды примитивов, являются:

· начальное значение и диапазон изменения значений семафора;

· логика действий семафорных операций;

· количество семафоров, доступных для обработки при исполнении отдельного примитива.

Обобщенный смысл примитива P(S) состоит в проверке текущего значения семафора S (P – от голландского P roberen – проверить), и если оно не меньше нуля, то осуществляется переход к следующей за примитивом операции. В противном случае процесс снимается на некоторое время с выполнения и переводится в состояние «пассивного ожидания». Находясь в списке заблокированных, ожидающий процесс не проверяет семафор непрерывно, как в случае активного ожидания.

Операция V(S) связана с увеличением значения семафора на единицу (V – от голландского V erhogen – увеличить) и переводом одного или нескольких процессов в состояние готовности к центральному процессору.

Операции P и V выполняются операционной системой в ответ на запрос, выданный некоторым процессом и содержащий имя семафора в качестве параметра.

Допустимыми значениями семафора являются только целые числа. Двоичным семафором называют семафор, максимальное значение которого равно единице. В противном случае семафоры называют N-ичными.

Рассмотрим на нашем примере двух конкурирующих процессов использование данных семафорных примитивов для решения проблемы критического интервала:

1) семафор имеет начальное значение, равное 1. Если процессы CS 1 и CS 2 попытаются одновременно выполнить примитив P(S), то это удастся сделать только одному из них. Пусть это будет CS 2:

2) процесс CS 2 закрывает семафор S (выполняет операцию P(S)) и выполняет свой критический интервал. Процесс CS 1 будет заблокирован на семафоре S. Тем самым гарантируется взаимное исключение;

3) после выполнения примитива V(S) процессом CS 2 семафор S открывается, указывая на возможность захвата каким-либо процессом освободившегося критического ресурса. При этом производится перевод процесса CS 1 из заблокированного состояния в состояние готовности.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: