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



              

Реализация семафоров - часть 4


/p>

Рисунок 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); }

<


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