272
любого из известных нам методов, предпочтителен –
иерархический;
• как и все методы, рассмотренные выше, семафоры требуют от
программиста корректного применения "скобок", в роли которых
выступают P- и V-операции.
Для решения задачи взаимного исключения достаточно двоичных
семафоров. Мы, однако, описали тип поля value как целое число. В
приведенном нами выше определении Дейкстры речь тоже идет о
целочисленном, а не о двоичном значении. Семафор, который может
принимать неотрицательные значения, большие, чем 1, называется общим
семафором. Такой семафор может быть очень удобен, например, при
управлении не единичным ресурсом, а классом ресурсов. Начальное
значение поля value для такого семафора устанавливается равным числу
единиц ресурса в классе. Каждое выделение единицы ресурса процессу
сопровождается P-операцией, уменьшающей значение семафора. Семафор,
таким образом, играет роль счетчика свободных единиц ресурса. Когда
этот счетчик достигнет нулевого значения, процесс, выдавший следующий
запрос на ресурс, будет заблокирован в своей P-операции. Освобождение
ресурса сопровождается V-операцией, которая разблокирует процесс,
ожидающий ресурс или наращивает счетчик ресурсов.
Общие семафоры могут быть использованы и для простого решения
задачи синхронизации. В этом случае семафор связывается с каким-либо
событием и имеет начальное значение 0. (Событие может рассматриваться
как ресурс, и до наступления события этот ресурс недоступен). Процесс,
ожидающий события, выполняет P-операцию и блокируется до установки
семафора в 1. Процесс, сигнализирующий о событии, выполняет над
семафором V-операцию. Для графа синхронизации, например, показанного
на рисунке 8.1, мы свяжем с каждым действием графа одноименный