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

Ядро считывает список операций oplist из адресного пространства задачи и проверяет корректность номеров семафоров, а также наличие у процесса необходимых разрешений на чтение и корректировку семафоров (Рисунок 11.15). Если таких разрешений не имеется, системная функция завершается неудачно. Если ядру приходится приостанавливать свою работу при обращении к списку операций, оно возвращает семафорам их прежние значения и находится в состоянии приостанова до наступления ожидаемого события, после чего системная функция запускается вновь. Поскольку ядро хранит коды операций над семафорами в глобальном списке, оно вновь считывает этот список из пространства задачи, когда перезапускает системную функцию. Таким образом, операции выполняются комплексно — или все за один сеанс или ни одной.

алгоритм semop /* операции над семафором */

входная информация:

 (1) дескриптор семафора

 (2) список операций над семафором

 (3) количество элементов в списке

выходная информация: исходное значение семафора

{

 проверить корректность дескриптора семафора;

start:

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

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

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

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

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

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

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

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

 }

 else

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

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

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

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

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

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

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

   continue;

  }

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

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

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

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

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

 }

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

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

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

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

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

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

   }

  }

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

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

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

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

}

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

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT