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

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

 проверить наличие разрешений на выполнение всех операций;

 for (каждой операции в списке)  {

  if (код операции имеет положительное значение)  {

  прибавить код операции к значению семафора;

  if (для данной операции установлен флаг UNDO)

   скорректировать структуру восстановления для данного процесса;

  вывести из состояния приостанова все процессы, ожидающие увеличения значения семафора;

 }

 else

  if (код операции имеет отрицательное значение)  {

   if (код операции + значение семафора ›= 0) {

    прибавить код операции к значению семафора;

    if (флаг UNDO установлен)

     скорректировать структуру восстановления для данного процесса;

    if (значение семафора равно 0)

     вывести из состояния приостанова все процессы, ожидающие обнуления значения семафора;

   continue;

  }

  выполнить все произведенные над семафором в данном сеансе операции в обратной последовательности (восстановить старое значение семафора);

  если (флаги не велят приостанавливаться)

   вернуться с ошибкой;

  приостановиться (до тех пор, пока значение семафора не увеличится);

  перейти на start;   /* повторить цикл с самого начала */

 }

 else { /* код операции равен нулю */

  if (значение семафора отлично от нуля)  {

   выполнить все произведенные над семафором в данном сеансе операции в обратной последовательности (восстановить старое значение семафора);

    if (флаги не велят приостанавливаться)  return ошибку;

    sleep (до тех пор, пока значение семафора не станет нулевым);

    goto start; /* повторить цикл */

   }

  }

 } /* конец цикла */

 /* все операции над семафором выполнены */

 скорректировать значения полей, в которых хранится время последнего выполнения операций и идентификаторы процессов ;

 вернуть исходное значение семафора, существовавшее в момент вызова функции semop;

}

Рисунок 11.15. Алгоритм выполнения операций над семафором

Ядро меняет значение семафора в зависимости от кода операции. Если код операции имеет положительное значение, ядро увеличивает значение семафора и выводит из состояния приостанова все процессы, ожидающие наступления этого события. Если код операции равен 0, ядро проверяет значение семафора: если оно равно 0, ядро переходит к выполнению других операций; в противном случае ядро увеличивает число приостановленных процессов, ожидающих, когда значение семафора станет нулевым, и "засыпает".

|< Пред. 596 597 598 599 600 След. >|

Java книги

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