Архитектура операционной системы UNIX


         

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


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

Если операция возвращает значение семафора, является ли она эквивалентной функции wakeup? while (value(semaphore) < 0) V(semaphore);

Если вмешательства со стороны других процессов нет, ядро повторяет цикл до тех пор, пока значение семафора не станет больше или равно 0, ибо это означает, что в состоянии приостанова по семафору нет больше ни одного процесса. Тем не менее, нельзя исключить и такую возможность, что сразу после того, как процесс A при тестировании семафора на одноименном процессоре обнаружил нулевое значение семафора, процесс B на своем процессоре выполняет операцию P, уменьшая значение семафора до -1 (). Процесс A продолжит свое выполнение, думая, что им возобновлены все приостановленные по семафору процессы. Таким образом, цикл выполнения операции не дает гарантии возобновления всех приостановленных процессов, поскольку он не является элементарным.
алгоритм P /* операция над семафором типа P */ входная информация: (1) семафор (2) приоритет выходная информация: 0 - в случае нормального завершения -1 - в случае аварийного выхода из состояния приостанова по сигналу, при- нятому в режиме ядра { Pprim(semaphore.lock); уменьшить (semaphore.value); если (semaphore.value >= 0) { Vprim(semaphore.lock); вернуть (0); } /* следует перейти в состояние приостанова */ если (проверяются сигналы) { если (имеется сигнал, прерывающий нахождение в сос- тоянии приостанова) { увеличить (semaphore.value); если (сигнал принят в режиме ядра) { Vprim(semaphore.lock); вернуть (-1); } в противном случае { Vprim(semaphore.lock); longjmp; } } } поставить процесс в конец списка приостановленных по се- мафору; Vprim(semaphore.lock); выполнить переключение контекста; проверить сигналы (см. выше); вернуть (0); }
Рисунок 12.8. Алгоритм выполнения операции P

Рассмотрим еще один феномен, связанный с использованием семафоров в однопроцессорной системе. Предположим, что два процесса, A и B, конкурируют за семафор. Процесс A обнаруживает, что семафор свободен и что процесс B приостановлен; значение семафора равно -1. Когда с помощью операции V процесс A освобождает семафор, он выводит тем самым процесс B из состояния приостанова и вновь делает значение семафора нулевым. Теперь предположим, что процесс A, по-прежнему выполняясь в режиме ядра, пытается снова заблокировать семафор. Производя операцию P, процесс приостановится, поскольку семафор имеет нулевое значение, несмотря на то, что ресурс пока свободен. Системе придется "раскошелиться" на дополнительное переключение контекста. С другой стороны, если бы блокировка была реализована на основе однопроцессорной схемы (sleep-lock), процесс A получил бы право на повторное использование ресурса, поскольку за это время ни один из процессов не смог бы заблокировать его. Для этого случая схема sleep-lock более подходит, чем схема с использованием семафоров.
алгоритм V /* операция над семафором типа V */ входная информация: адрес семафора выходная информация: отсутствует { Pprim(semaphore.lock); увеличить (semaphore.value); если (semaphore.value <= 0) { удалить из списка процессов, приостановленных по се- мафору, первый по счету процесс; перевести его в состояние готовности к запуску; } Vprim(semaphore.lock); }
<

Содержание  Назад  Вперед