- •Глава 9. Компоненты и подсистемы операционных систем Компоненты и подсистемы Windows
- •Ресурсы
- •Управление программами
- •Управление оперативной памятью
- •Файловая система
- •Драйверы устройств ввода/вывода
- •Библиотеки динамической загрузки dll
- •Интерфейс графических устройств gdi
- •Управление шрифтами
- •Вставка и привязка объектов ole
- •Другие компоненты и подсистемы
- •Невытесняющая мультизадачность Microsoft Windows
- •Переключение программ
- •Вытесняющая мультизадачность ibm os/2
- •Семафоры
- •Каналы передачи данных между процессами
- •Очереди
- •Система управления памятью
- •Управление памятью в первых версиях ibm os/2 и в стандартном режиме Microsoft Windows
- •Адресация памяти в ibm os/2 Warp
- •Модель памяти flat
- •Файловая система
- •Недостатки файловой системы dos
- •Файловая система hpfs
- •Библиотеки динамической компоновки
- •Драйверы
- •Создание и удаление каналов
- •Работа с базой данных объектов
Семафоры
Семафоры в IBM OS/2 по своему назначению напоминают одноименные сооружения, которые вы видели на железной дороге. Их задача - организация правильной последовательности выполнения задач. Так же как отсутствие семафора на железнодорожном переезде может привести к катастрофе, так и неконтролируемый доступ параллельно работающих задач к тем или иным ресурсам может привести к аварийному завершению работы программы, а то и к выходу из строя всей операционной системы.
По запросу задачи операционная система может создать один или несколько семафоров, пригодных для синхронизации задач, выполняющихся в рамках одного или разных процессов. При создании семафора ему присваивается идентификатор, который используется во всех последующих операциях, выполняемых над семафором.
Не вдаваясь пока в подробности, скажем, что семафор IBM OS/2 можно представить себе как объект, способный находиться в двух состояниях: установленном и сброшенном. При помощи специальных функций задача может переключать семафоры из одного состояния в другое, а также выполнять ожидание момента времени, когда семафор будет переключен другой задачей. Если вам нужна аналогия, представьте себе все тот же железнодорожный переезд и цепочку автомобилей (задач), ожидающих переключения семафора.
Теперь мы опять вернемся к нашему "музыкальному" расчету. Попробуем организовать синхронизацию задач Calculate и PrintAll с использованием семафора.
Для этого в основной задаче, которая получает управление при запуске процесса, создадим семафор и сразу сбросим его. Затем после ввода данных запустим процессы PlayMusic, Calculate и PrintAll.
В самом начале процесса PrintAll вызовем специальную функцию из программного интерфейса IBM OS/2, выполняющую ожидание семафора. Если семафор сброшен (а сразу после запуска задачи PrintAll так оно и есть), задача PrintAll приостановит свое выполнение и перейдет в состояние ожидания. В этом состоянии она не загружает процессор и не мешает работать другим задачам.
После выполнения расчетов задача Calculate устанавливает семафор и завершается, разрешая, таким образом, печать результатов расчета.
Как только семафор окажется в установленном состоянии, задача PrintAll выйдет из состояния ожидания и начнет свою работу.
Что же касается задачи PlayMusic, то она все еще работает. Эту задачу можно остановить либо из задачи PrintAll после выполнения печати, либо из основной задачи.
Итак, с помощью семафоров нам удалось организовать синхронизацию нескольких задач. Отметим, что в составе программного интерфейса IBM OS/2 имеется набор удобных в использовании функций, предназначенных для работы с задачами и семафорами.
Задача может создать семафоры трех типов, с помощью которых можно организовать ожидание одного или нескольких событий, а также организовать последовательное использование ресурсов, к которым невозможен одновременный доступ со стороны нескольких задач.
Каналы передачи данных между процессами
Как мы уже говорили, при запуске программы операционная система создает новый процесс, имеющий изолированное адресное пространство. Изоляция повышает надежность системы, так как ни в результате ошибки, ни намеренно один процесс не сможет адресовать память другого процесса.
Однако полностью изолированные процессы не смогут обмениваться данными через оперативную память, что очень неудобно. Конечно, один процесс может подготовить данные для другого процесса в виде файла на диске, но этот способ передачи данных хотя и работает, но слишком медленно.
Система управления памятью IBM OS/2 позволяет создавать совместно используемые области памяти (shared memory), которые, в принципе, можно использовать для организации передачи данных между процессами. Однако такой способ требует использования средств синхронизации задач и не пригоден для передачи данных между процессами, запущенными на разных рабочих станциях локальной сети.
В операционной системе IBM OS/2 предусмотрено специальное средство передачи данных между различными процессами - каналы (pipes ).
Канал - это специальная область памяти, созданная операционной системой по запросу процесса специально для передачи данных между процессами. Канал может иметь имя (а может и не иметь).
Работа с каналом больше всего напоминает работу со стандартным потоком ввода или вывода в операционной системе DOS. Процесс создает канал, вызывая специально предназначенную для этого функцию, возвращающую идентификатор канала. Затем процесс может передавать данные в канал или принимать их из канала, вызывая функции, напоминающие функции записи и чтения для стандартных потоков ввода/вывода DOS.
Отметим специально, что IBM OS/2 позволяет создать каналы между процессами, запущенными на различных рабочих станциях локальной сети (если установлена сеть с серверами IBM LAN Server). Таким образом, средства передачи данных по локальной сети встроены непосредственно в ядро IBM OS/2, что очень удобно для программиста.
