Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Процессы-ресурсы - теория.doc
Скачиваний:
13
Добавлен:
20.08.2019
Размер:
894.46 Кб
Скачать
  1. Взаимодействие процессов и синхронизация задач в os/2

Для синхронизации выполнения задач в OS/2 существуют различные механизмы.

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

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

Начало и конец критической секции ограничиваются сверху и снизу вызовом соответственно функций DosEnterCritSec и DosExitCritSec:

// Начало критической секции

DosEnterCritSec() ;

// Этот фрагмент кода задачи будет выполняться в монопольном

// режиме по отношению к другим потокам процесса

...

// Конец критической секции

DosExitCritSec()

Критические секции, организованные средствами данной ОС фактически отменяют режим мультизадачности в рамках одного процесса: любая задача, начавшая выполнение своей критической секции прерывает выполнение других задач до ее завершения.

По запросу задач OS/2 может создать один или несколько семафоров для синхронизации их выполнения.

В OS/2 существуют три типа семафоров, с помощью которых можно организовать ожидание одного или нескольких событий, а также реализовать последовательное использование ресурсов, к которым невозможен параллельный доступ:

Семафор

Применение

Mutex

Используется как классические семафоры с примитивами P() и V() для реализации взаимного исключения и синхронизации задач

Событие

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

MuxWait

Используются для того, чтобы процесс или нить могли ожидать на нескольких семафорах сразу

В OS/2 могут создаваться как разделяемые, так и собственные семафоры. Разделяемые (совместно используемые) семафоры применяются потоками одного или нескольких процессов. Собственные семафоры используются нитями только одного процесса. Для синхронизации в рамках одного процесса применение собственных семафоров более эффективно.

В данной ОС используется также механизм именованных семафоров. Именованные семафоры по определению являются общедоступными. Это позволяет любому процессу, который знает о семафоре (то есть ему известно имя семафора), обращаться к нему. Для совместного использования неименованных семафоров несколькими процессами предусматривается описатель.

Для использования семафора требуется, чтоб один из процессов создал семафор и передал информацию о нем другим процессам или нитям (через имена или механизм описателей). Другие процессы могут открыть семафор, использовать его и закрыть (операции открытия и закрытия семафора в данном контексте не соответствуют семафорным примитивам - это операции открытия объекта для получения доступа к нему). Когда число закрытий сравнивается с числом закрытий, семафор освобождается. Если процесс, создавший семафор, завершил работу, то операции на этом семафоре возвращают ошибку ERRO_SEM_OWNER_DIED.

Для создания семафора Mutex используется функция DosCreateMutexSem, в качестве параметров которой может быть передано имя (для создания именованного семафора), признак того, является ли семафор разделяемым, для неименованного семафора задаются привилегии защиты, а также определяется начальное состояние семафора. Возвращается значение его описателя.

Для запроса доступа к уже созданному семафору используется функция DosOpenMutexSem, в качестве параметров которой задается имя (для именованного семафора в форме \sem32\имя) и описатель.

Для закрытия доступа к семафору служит функция DosCloseMutexSem с параметром, задающим описатель семафора.

Семафорный примитив P() реализуется с помощью функции DosRequestMutexSem, при вызове которой указывается описатель запрашиваемого семафора и максимальное время ожидания на нем.

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

Для проверки семафора может быть использована функция DosQueryMutexSem.

Синхронизирующие события в OS/2 создаются функцией DosCreateEventSem, при вызове которой определяется имя (для именованного семафора) и переменная-описатель.

Другие потоки или процессы для начала работы с событием должны его открыть с помощью DosOpenEventSem. Для прекращения работы с событием его следует закрыть функцией DosCloseEventSem.

События могут иметь два состояния: установлено или очищено. События, которых ожидают процессы или нити считаются установленными. Вызов DosWaitEventSem будет ставить нить в очередь ожидания очистки события. DosPostEvent сигнализирует соответствующим семафором события, что оно произошло, после чего все ожидающие его нити будут планироваться для выполнения. При этом семафор переводится в сигнальное состояние, для сброса которого, чтобы нити могли блокироваться по другому событию, используется вызов DosResetEventSem (возвращение семафора в установленное состояние).

DosQueryEventSem возвращает число наступивших событий после последнего сброса. Закрывает семафор функция DosCloseEventSem.

Из рассматриваемых в данном пособии платформ OS/2 имеет наиболее широкий механизм семафоров.

Для передачи данных между процессами могут использоваться каналы. Система управления памятью позволяет создавать совместно используемые области памяти, но их использование требует синхронизации. Каналы (pipes) - специальное средство передачи данных между двумя процессами.

Процесс создает канал с помощью специальной процедуры, возвращающей идентификатор созданного канала. Функции передачи данных через канал сходны с функциями чтения или записи для стандартных потоков ввода/вывода DOS. Данная ОС позволяет создавать каналы между процессами, запущенными на различных рабочих станциях в локальной сети. Набор функций OS/2 для работы с именованными каналами практически совпадает с соответствующими средствами Windows NT.

Помимо каналов в OS/2 существует более сложное средство передачи данных между процессами - очереди.

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

Процесс или задача, создавшие очередь, называются серверным процессом для этой очереди. Серверный процесс является владельцем очереди и может извлекать и читать (без извлечения) информацию из нее в любом порядке, в то время как канал можно использовать только для последовательной передачи данных.

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

Для синхронизации передачи данных через очередь может использоваться семафор.