Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
[Проектирование операционных систем] - Курс лек....doc
Скачиваний:
22
Добавлен:
14.11.2018
Размер:
347.14 Кб
Скачать

Простые семафоры

Существуют два варианта допустимых множеств для значений семафоров:

  • целые числа больше или равные 0;

  • целые числа больше и меньше 0.

Особый случай первого варианта – (0, 1) – двоичный семафор.

Операция закрытия заключается в проверке текущих значений семафора и, если оно больше 0, выполняется уменьшение на 1 значения семафора и переход к выполнению следующей после закрытия семафора операции. Если значение семафора равно 0 (или для другого варианта ≤ 0), то процесс переводится в состояние пассивного ожидания. Иными словами, процесс не может развиваться дальше закрытого семафора.

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

//Философ N

Void philosopher (int N)

{

P((N%5), (N+1)%5);

// еда

V((N%5), (N+1)%5);

}

При извлечении процесса из очереди ожидающих семафора повторное выполнение примитива закрытия может привести к искажению значения семафора.

Начальное значение семафора > 1 указывает на предельное число процессов, которые могут одновременно находиться в своих критических областях. В случае, когда S є [0; +∞), нам понадобится дополнительный параметр L – длина очереди ожидания.

//Философ N

Void philosopher (int N)

{

P((N%5), (N+1)%5);

// еда

V((N%5), (N+1)%5);

}

Множественные семафоры

Особенностью такого механизма является возможность проверки в одном примитиве не одного, а нескольких семафоров и обработки их по определенным правилам. К семафорам, как и ранее, выстраиваются очереди ожидающих процессов. Основная сложность задачи заключается в том, что нет однозначной связи между семафором и очередью ожидания.

//Философ N

Void philosopher (int N)

{

P((N%5), (N+1)%5);

// еда

V((N%5), (N+1)%5);

}