Архитектура операционной системы 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 След. >|

Java книги

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