- •1.Классификация программного обеспечения. Функции операционных систем.
- •2.Примеры операционных систем. Требования, предъявляемые к операционной системе на примере операционной системы управления химическим реактором.
- •3.Механизмы выполнения программ: понятия активности, контекста активности, точки наблюдения.
- •4.Механизмы выполнения программ: стек выполнения, алгоритм вызова процедур.
- •Приоритет и маскировка прерываний
- •Общая организация ввода/вывода
- •Адресация периферийных устройств
- •Управление периферийными устройствами
- •Принципы работы канала ввода-вывода. Буферный ввод-вывод.
- •Организация простейшей ос для одного пользователя исходя из метода нисходящей декомпозиции (мнд)
- •Система управления файлами.
- •Машина ввода вывода.
- •Стратегия выбора буфера.
- •Далее 4 и 5 работа
- •Взаимодействие совокупности процессов
- •Синхронизация процессов
- •Блокировка памяти
- •Проверка и установка
- •Монитор Хоара
- •Семафоры
- •Состав цепи доступа
- •Структура представлений. Дескрипторы
Монитор Хоара
Монитор состоит из множества переменных состояния и множества процедур, которые используют эти переменные. Некоторые из этих процедур, называемые внешними, доступны пользователям монитора; их имена называются точками входа в монитор. Процессы, которые используют монитор, не имеют прямого доступа к переменным состояния. Они могут воспользоваться монитором только путем вызова внешних процедур; процедуры включают операции, которые позволяют блокировать или активизировать процессы в соответствии со спецификацией задачи. Блокированные процессы группируются в очередь ожидания. Условия установки и снятия блокировки записываются в виде функций переменных состояния, и механизм работы монитора гарантирует, что все преобразования этих переменных происходят при взаимном исключении. Наконец, монитор содержит программу инициализации, которая выполняется только один раз - при создании монитора.
Базовыми примитивами монитора являются следующие процедуры:
ЖДАТЬ - блокирует процесс и ставит его в очередь ожидания;
ПУСТО - логическая функция (выдает true, если очередь ожидания пуста);
СИГНАЛИЗИРОВАТЬ - если не ПУСТО, то активизирует один процесс из очереди ожидания.
Процесс, активизируемый примитивом СИГНАЛИЗИРОВАТЬ, начинает свою работу с инструкции, идущей сразу же за примитивом ЖДАТЬ, который его блокировал.
Для описания монитора удобнее всего использовать методы объектно-ориентированного программирования, что мы в дальнейших примерах и задачах и будем делать. Базовые примитивы монитора будем считать заданными в качестве методов объекта TMonitor:
Листинг 4.5. Объявление монитора
type TMonitor=object private <внутренние переменные и очереди ожидания>; protected procedure ЖДАТЬ; procedure СИГНАЛИЗИРОВАТЬ; function ПУСТО: boolean; end;
В качестве простейшего примера рассмотрим следующую задачу. Пусть имеются два процесса: p и q. Процесс p записывает данные в буфер, процесс q читает их из буфера. Процесс q не может начать чтение до завершения процессом p записи. Необходимо синхронизировать их работу.
Для решения этой задачи объявим монитор, являющийся наследником объекта TMonitor (Листинг 4 .6).
Листинг 4.6
type TBufMonitor=object(TMonitor) private ЗАВЕРШЕН: boolean; public procedure ИНИЦИАЛИЗИРОВАТЬ; procedure КОНЕЦ_ЗАПИСИ; procedure НАЧАЛО_ЧТЕНИЯ; end; procedure TBufMonitor.ИНИЦИАЛИЗИРОАТЬ; begin ЗАВЕРШЕН:=false; end; procedure TBufMonitor.КОНЕЦ_ЗАПИСИ; begin ЗАВЕРШЕН:=true; СИГНАЛИЗИРОВАТЬ; end; procedure TBufMonitor.НАЧАЛО_ЧТЕНИЯ; begin if not ЗАВЕРШЕН then ЖДАТЬ; end;
Здесь переменная состояния ЗАВЕРШЕН сигнализирует о том, занят ли буфер каким-либо процессом. Процедуры КОНЕЦ_ЗАПИСИ и НАЧАЛО_ЧТЕНИЯ должны быть неделимыми.
Монитор используется следующим образом.
Листинг 4.7
{--общая часть--} var m:TBufMonitor; m.ИНИЦИАЛИЗИРОВАТЬ;
|
|
ПРОЦЕСС p |
ПРОЦЕСС q |
ЗАПИСАТЬ(a); |
<начало q> |
m.КОНЕЦ_ЗАПИСИ; |
m.НАЧАЛО_ЧТЕНИЯ; |
<продолжение p> |
ПРОЧИТАТЬ(a) |
