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

         

Семафоры - часть 4


/p>

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

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

вывести из состояния приостанова все процессы, ожидающие обнуления значе- ния семафора; продолжить; } выполнить все произведенные над семафором в данном сеансе операции в обратной последова- тельности (восстановить старое значение сема- фора); если (флаги не велят приостанавливаться) вернуться с ошибкой; приостановиться (до тех пор, пока значение се- мафора не увеличится); перейти на start; /* повторить цикл с самого * начала * / } в противном случае /* код операции равен нулю */ { если (значение семафора отлично от нуля) { выполнить все произведенные над семафором в данном сеансе операции в обратной по- следовательности (восстановить старое значение семафора); если (флаги не велят приостанавливаться) вернуться с ошибкой; приостановиться (до тех пор, пока значение семафора не станет нулевым); перейти на start; /* повторить цикл */ } } } /* конец цикла */ /* все операции над семафором выполнены */ скорректировать значения полей, в которых хранится вре- мя последнего выполнения операций и идентификаторы процессов; вернуть исходное значение семафора, существовавшее в момент вызова функции semop; }




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