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