Операционная система OS2 Warp

       

Семафоры


Семафоры в IBM OS/2 по своему назначению напоминают одноименные сооружения, которые вы видели на железной дороге. Их задача - организация правильной последовательности выполнения задач. Так же как отсутствие семафора на железнодорожном переезде может привести к катастрофе, так и неконтролируемый доступ параллельно работающих задач к тем или иным ресурсам может привести к аварийному завершению работы программы, а то и к выходу из строя всей операционной системы.

По запросу задачи операционная система может создать один или несколько семафоров, пригодных для синхронизации задач, выполняющихся в рамках одного или разных процессов. При создании семафора ему присваивается идентификатор, который используется во всех последующих операциях, выполняемых над семафором.

Не вдаваясь пока в подробности, скажем, что семафор IBM OS/2 можно представить себе как объект, способный находиться в двух состояниях: установленном и сброшенном. При помощи специальных функций задача может переключать семафоры из одного состояния в другое, а также выполнять ожидание момента времени, когда семафор будет переключен другой задачей. Если вам нужна аналогия, представьте себе все тот же железнодорожный переезд и цепочку автомобилей (задач), ожидающих переключения семафора.

Теперь мы опять вернемся к нашему "музыкальному" расчету. Попробуем организовать синхронизацию задач Calculate и PrintAll с использованием семафора.

Для этого в основной задаче, которая получает управление при запуске процесса, создадим семафор и сразу сбросим его. Затем после ввода данных запустим процесс PlayMusic, Calculate и PrintAll.

В самом начале процесса PrintAll вызовем специальную функцию из программного интерфейса IBM OS/2, выполняющую ожидание семафора. Если семафор сброшен (а сразу после запуска задачи PrintAll так оно и есть), задача PrintAll приостановит свое выполнение и перейдет в состояние ожидания. В этом состоянии она не загружает процессор и не мешает работать другим задачам.

После выполнения расчетов задача Calculate устанавливает семафор и завершается, разрешая, таким образом, печать результатов расчета.

Как только семафор окажется в установленном состоянии, задача PrintAll выйдет из состояния ожидания и начнет свою работу.

Что же касается задачи PlayMusic, то она все еще работает. Эту задачу можно остановить либо из задачи PrintAll после выполнения печати, либо из основной задачи.

Итак, с помощью семафоров нам удалось организовать синхронизацию нескольких задач. Отметим, что в составе программного интерфейса IBM OS/2 имеется набор удобных в использовании функций, предназначенных для работы с задачами и семафорами.

Задача может создать семафоры трех типов, с помощью которых можно организовать ожидание одного или нескольких событий, а также организовать последовательное использование ресурсов, к которым невозможен одновременный доступ со стороны нескольких задач.



Содержание раздела