Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia (1).docx
Скачиваний:
18
Добавлен:
01.03.2025
Размер:
187.86 Кб
Скачать
      1. Монитор Хоара

Монитор состоит из множества переменных состояния и множества процедур, которые используют эти переменные. Некоторые из этих процедур, называемые внешними, доступны пользователям монитора; их имена называются точками входа в монитор. Процессы, которые используют монитор, не имеют прямого доступа к переменным состояния. Они могут воспользоваться монитором только путем вызова внешних процедур; процедуры включают операции, которые позволяют блокировать или активизировать процессы в соответствии со спецификацией задачи. Блокированные процессы группируются в очередь ожидания. Условия установки и снятия блокировки записываются в виде функций переменных состояния, и механизм работы монитора гарантирует, что все преобразования этих переменных происходят при взаимном исключении. Наконец, монитор содержит программу инициализации, которая выполняется только один раз - при создании монитора.

Базовыми примитивами монитора являются следующие процедуры:

  • ЖДАТЬ - блокирует процесс и ставит его в очередь ожидания;

  • ПУСТО - логическая функция (выдает 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)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]