Архитектура операционной системы UNIX :: Бах Морис Дж.
Страница:
636 из 715
Тем не менее, нельзя исключить и такую возможность, что сразу после того, как процесс A при тестировании семафора на одноименном процессоре обнаружил нулевое значение семафора, процесс B на своем процессоре выполняет операцию P, уменьшая значение семафора до -1 (Рисунок 12.10). Процесс A продолжит свое выполнение, думая, что им возобновлены все приостановленные по семафору процессы. Таким образом, цикл выполнения операции не дает гарантии возобновления всех приостановленных процессов, поскольку он не является элементарным.
алгоритм P /* операция над семафором типа P */
входная информация:
(1) семафор
(2) приоритет
выходная информация:
0 — в случае нормального завершения
-1 — в случае аварийного выхода из состояния приостанова по сигналу, принятому в режиме ядра
{
Pprim(semaphore.lock);
уменьшить (semaphore.value);
if (semaphore.value ›= 0) {
Vprim(semaphore.lock);
return (0);
}
/* следует перейти в состояние приостанова */
if (проверяются сигналы) {
if (имеется сигнал, прерывающий нахождение в состоянии приостанова) {
увеличить (semaphore.value);
if (сигнал принят в режиме ядра) {
Vprim(semaphore.lock);
return(-1);
}
else {
Vprim(semaphore.lock);
longjmp;
}
}
}
поставить процесс в конец списка приостановленных по семафору;
Vprim(semaphore.lock);
выполнить переключение контекста;
проверить сигналы (см. выше);
return(0);
}
Рисунок 12.8.
|< Пред. 634 635 636 637 638 След. >|