
- •2. Теоретические основы построения операционных систем
- •Процессы и ресурсы
- •2.1.1. Определение процесса
- •Операционная система
- •П роцесс 1 Процесс 2 . . . Процесс n
- •2.1.2. Понятие ресурса
- •2.1.4. Планирование процессов
- •Центральный процессор
- •Центральный процессор
- •2.1.5. Классификация процессов
- •2.1.6. Классификация ресурсов
- •2.1.7. Структуры данных для управления процессами и ресурсами
- •2.1.8. Ядро операционной системы и реализация базовых функций ос
- •2.2. Проблема синхронизации и взаимное исключение
- •2.2.1. Определение и свойства критической секции
- •2.2.2. Программные методы реализации взаимного исключения
- •2.2.3. Синхронизация процессов с помощью семафоров
- •2.2.4. Реализация примитивов взаимоисключения
- •2.2.5. Параллельное программирование и мониторы
- •2.2.6. Рандеву как модель организации взаимодействия процессов
- •2.2.7. Система прохождения сообщений
- •2.2.8. Многозадачность и языки программирования
- •Взаимодействие процессов и синхронизация задач в os/2
- •2.2.10. Организация взаимодействия процессов и потоков в Win32
- •2.3. Проблема тупика
- •2.3.1. Определение тупика
- •Необходимые условия возникновения тупика и решение задачи предотвращения тупика
- •2.3.3. Модель системы для исследования проблемы тупика
- •2.3.4. Методы распознавания тупика
- •2.3.5. Выход из тупика и восстановление работоспособности системы
- •2.3.6. Методы обхода тупиков
Взаимодействие процессов и синхронизация задач в 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 существует более сложное средство передачи данных между процессами - очереди.
Очереди позволяют организовать передачу данных от нескольких передающих процессов к одному принимающему. Они также могут использоваться для передачи данных между различными задачами одного процесса.
Процесс или задача, создавшие очередь, называются серверным процессом для этой очереди. Серверный процесс является владельцем очереди и может извлекать и читать (без извлечения) информацию из нее в любом порядке, в то время как канал можно использовать только для последовательной передачи данных.
Остальные процессы, использующие очередь, называются клиентными процессами. Они могут только записывать данные в очередь.
Для синхронизации передачи данных через очередь может использоваться семафор.