Архитектура операционной системы UNIX :: Бах Морис Дж.
Страница:
597 из 715
алгоритм semop /* операции над семафором */
входная информация:
(1) дескриптор семафора
(2) список операций над семафором
(3) количество элементов в списке
выходная информация: исходное значение семафора
{
проверить корректность дескриптора семафора;
start:
считать список операций над семафором из пространства задачи в пространство ядра;
проверить наличие разрешений на выполнение всех операций;
for (каждой операции в списке) {
if (код операции имеет положительное значение) {
прибавить код операции к значению семафора;
if (для данной операции установлен флаг UNDO)
скорректировать структуру восстановления для данного процесса;
вывести из состояния приостанова все процессы, ожидающие увеличения значения семафора;
}
else
if (код операции имеет отрицательное значение) {
if (код операции + значение семафора ›= 0) {
прибавить код операции к значению семафора;
if (флаг UNDO установлен)
скорректировать структуру восстановления для данного процесса;
if (значение семафора равно 0)
вывести из состояния приостанова все процессы, ожидающие обнуления значения семафора;
continue;
}
выполнить все произведенные над семафором в данном сеансе операции в обратной последовательности (восстановить старое значение семафора);
если (флаги не велят приостанавливаться)
вернуться с ошибкой;
приостановиться (до тех пор, пока значение семафора не увеличится);
перейти на start
|< Пред. 595 596 597 598 599 След. >|