- •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. Методы обхода тупиков
2.2.7. Система прохождения сообщений
Для узких областей применения в качестве средства межпроцессной коммуникации может быть использован менее общий механизм высокого уровня - система прохождения сообщений.
При определении системы прохождения сообщений обычно применяют конструкцию данных, называемую буфером, которая служит в качестве “почтового ящика” при передаче сообщений.
Один процесс может послать другому процессу сообщение с помощью специальной процедуры, в качестве параметров которой могут быть указаны передаваемое сообщение, почтовый ящик, в который оно должно быть помещено, и приоритет данного сообщения.
Для получения очередного сообщения процесс также должен обратиться к специальной процедуре, указав в качестве параметра почтовый ящик, из которого это сообщение должно извлекаться.
Сам буфер обычно организуется в виде очереди с определенной дисциплиной (обычно - FIFO, но с учетом приоритета). Размер буфера выбирается с учетом предъявляемых требований. Если при передаче сообщения буфер оказывается переполненным, то передающий процесс может быть приостановлен, пока адресат не извлечет сообщение из буфера.
С помощью сообщений можно программировать передачу данных и синхронизацию процессов (сообщения могут рассматриваться как синхронизирующие сигналы). Если же использовать систему передачи сообщений для защиты общих ресурсов, то в данном случае она будет неэффективной, а использующие ее программы будут трудны для понимания.
2.2.8. Многозадачность и языки программирования
Большинство современных языков программирования разрабатывались с ориентацией на последовательное выполнение программ, поэтому в них не предусматриваются специальные средства для написания параллельных программ и для синхронизации их выполнения. При использовании таких языков для синхронизации параллельно выполняющихся процессов могут использоваться средства, предоставляемые операционными системами. Но существуют языки, в которые при их разработке были заложены средства для создания параллельно выполняющихся частей программ (например, Modula, Ада).
На концептуальном уровне процесс можно представить как аналог процедуры: описание каждой процедуры представляет собой определение ее данных и выполняемых над ними действий. Для возбуждения этих действия существует отдельный оператор вызова процедуры.
При применении аналогичного подхода к процессам получается описание процесса, определяющее данные процесса и множество последовательных действий. Так же как для вызова процедуры, для активизации процесса необходим специальный оператор, инициирующий выполнение этих действий.
Особенность описания процесса (в отличие от процедуры) состоит в том, что при порождении и активизации процесса для управления им и согласования с выполнением других процессов используется другой механизм, с помощью которого порожденный процесс может выполняться параллельно с основной, породившей его программой и другими процессами. Этот механизм отличен от обычной передачи управления, при выполнении которой вызвавшая подпрограмму программа приостанавливается до окончания процедуры, когда управление возвращается вызвавшей программе.
Продолжая аналогию с процедурой, можно указать, что процесс можно специфицировать с помощью параметров, к нему можно обращаться повторно, указывая различные условия выполнения.
Главная программа, порождающая процесс, называется родительским процессом, а созданные в ней процессы - порожденными процессами. При необходимости может быть порождена целая иерархия процессов.
Если расширить понятие процедуры так, чтоб оно охватывало представление параллельных процессов, то такое их определение имеет несомненное достоинство, состоящее в том, что упрощается понимание процесса. В действительности подобные механизмы используются в различных языках (определение процессов в языке Modula, описание задач в языке Ада, потоков в Java, Delphi и C++ Builder). Средства описания процедур в этих языках дополняются специальными операторами для организации межпроцессного взаимодействия.
Для получения доступа к средствам управления процессами операционных систем могут использоваться специальные библиотеки (например, для порождения потоков и управления их взаимодействием в программах, написанных на C или C++ для Windows 95 или Windows NT).
