Архитектура операционной системы UNIX   ::   Бах Морис Дж.

Страница: 635 из 715

Использование операций P и V в тех случаях, когда устанавливающие блокировку процессы получают доступ к ресурсу поочередно, а все остальные процессы — в порядке поступления запросов, является более предпочтительным. В сравнении с однопроцессорной процедурой блокирования (sleep-lock) данная схема обычно выигрывает, так как если при наступлении события все процессы возобновляются, большинство из них может вновь наткнуться на блокировку и снова перейти в состояние приостанова. С другой стороны, в тех случаях, когда требуется вывести из состояния приостанова все процессы одновременно, использование операций P и V представляет известную сложность.

struct semaphore {

 int lock;

};

Init(semaphore)

struct semaphore semaphore;

{

 semaphore.lock = 1;

}

Pprim(semaphore)

struct semaphore semaphore;

{

 while (read_and_clear(semaphore.lock));

}

Vprim(semaphore)

struct semaphore semaphore;

{

 semaphore.lock = 1;

}

Рисунок 12.7. Операции над семафором, использующие инструкцию read_and_clear

Если операция возвращает значение семафора, является ли она эквивалентной функции wakeup?

while (value(semaphore) ‹ 0) V(semaphore);

Если вмешательства со стороны других процессов нет, ядро повторяет цикл до тех пор, пока значение семафора не станет больше или равно 0, ибо это означает, что в состоянии приостанова по семафору нет больше ни одного процесса.

|< Пред. 633 634 635 636 637 След. >|

Java книги

Контакты: [email protected]