Работа №4
Задание, представленное ниже, представляют собой задачу на организацию доступа к общему (разделяемому, критическому) ресурсу некоторого числа параллельных процессов.
Для управления доступом к общему ресурсу наиболее целесообразно создать объект - монитор. Монитор состоит из множества переменных состояния и множества процедур, которые используют эти переменные. Некоторые из этих процедур, называемые внешними, доступны пользователю и называются точками входа в монитор. Процессы, которые используют монитор для синхронизации, не имеют прямого доступа к переменным состояния. Они могут воспользоваться монитором только путем вызова внешних процедур. Процедуры монитора включают операции, которые позволяют блокировать и активизировать процессы в соответствие со спецификацией задачи. Условия установки и снятия блокировки записываются в виде функций переменных состояния и механизм работы монитора гарантирует, что все преобразования этих переменных происходят при взаимном исключении.
Монитор может иметь следующее общее описание (в терминах объектно-ориентированного языка Pascal):
Type
TMonitor = Object
данные - переменные состояния
Constructor Init(...);
Destructor Done; Virtual;
Procedure Enter;
Procedure Exit; End TMonitor.
В качестве данных выступают параметры спецификации задачи и очереди ожидания процессов.
Метод TMonitor.Enter, анализируя данные, выполняет следующие действия:
- проверяет условия входа в критический участок; при выполнении этих условий процесс, вызвавший метод, продолжает выполняться, войдя в критический участок; при невыполнении - процесс блокируется в очереди монитора;
- устанавливает необходимые значения переменных состояния при блокировании процесса и при продолжении выполнения в критическом участке.
|
Метод TMonitor.Exit выполняет следующие действия:
- устанавливает необходимые значения переменных состояния при выходе из критического участка;
- проверяет условия возможной активизации ждущих процессов и активизарует их при выполнении этих условий.
Структура процедуры, реализующей процесс, осуществляющий доступ к критическому ресурсу с помощью монитора, будет выглядеть следующим образом:
Procedure Process;
Begin
действия процесса до входа в критический участок
Monitor.Enter;
действия процесса в критическом участке
Monitor.Exit;
действия процесса после выхода из критического участка
End Process;
здесь Monitor - это переменная типа TMonitor, являющаяся
экземпляром указанного объекта.
Количество различающихся методов входа в критический участок и методов выхода из него определяется количеством разновидностей процессов в каждой прикладной задаче.
В представленной ниже задаче требуется создать свой монитор. Основой решения каждой задачи является формирование и формализация условий входа в критический участок и условий активизации ждущих процессов при выходе из критического участка.
Методика решения задачи предлагает один выриант решения, что конечно же, не исключает возможности решения задачи с помощью других алгоритмов.
Для тех, кто затрудняется создать свой монитор, рекомендуется запрограммировать условия, предлагаемые в методике решения каждого задания в виде отдельных процедур.
Практическое решение задачи оформляется в виде отчета. Отчет должен содержать:
|
- спецификацию задачи;
- обоснование условий входа в критический участок и активизации ждущих процессов при выходе из него для каждой разновидности процессов;
- текст программы с комментариями.
Требования к программам, реализующим задания:
- программа должна выглядеть как законченный продукт - иметь средства, отображающие на экране действия и состояния всех процессов.
Задача 6. МОДЕЛЬ КЛИЕНТ-СЕРВЕР
Имеется N процессов-клиентов и один процесс-сервер.
Процессы-клиенты в случайные моменты времени запрашивают обслуживание у процесса-сервера. Если процесс-сервер свободен, то он выполняет обслуживание клиента и переходит в состояние ожидания запроса.
Если процесс-клиент запрашивает обслуживание, когда процесс-сервер занят, то клиент приостанавливает свое выполнение и ждет обслуживания в очереди.
Требуется запрограммировать задачу, написав монитор "Сервер", реализующий обслуживание клиентов в порядке очередности их запросов.
Методика решения
Ведем дополнительные условия:
- процесс-сервер запускается первым и ждет запросов на обслуживание;
- процесс-клиент блокируется не только при ожидании обслуживания, но и на время самого обслуживания.
Структура программы для описанных условий может выглядеть следующим образом:
Program Lab6;
Uses MultiObj;
Type
PMonitor = ^TMonitor;
TMonitor = Object
Cl_List, очередь клиентов, ждущих обслуживания Cl_s_List, очередь из одного клиента, обслуживаемого
в данный момент
Sr_List: List; очередь, в которой сервер ждет запросов на обслуживание
Constructor Init;
|
Destructor Done;
Procedure Request; запрос клиента на обслуживание Procedure Waiting; ожидание сервером запросов
End TMonitor;
--Методы монитора разрабатываются учащимися--
Var
Monitor: PMonitor;
Procedure Client_1;
Begin
While True Do Begin
случайное время до запроса на обслуживания Monitor^.Request;
End While;
End Client_1;
Procedure Client_2;
Begin
While True Do Begin
случайное время до запроса на обслуживания Monitor^.Request;
End While;
End Client_2;
Procedure Client_3;
Begin
While True Do Begin
случайное время до запроса на обслуживания Monitor^.Request;
End While;
End Client_3;
Процессы-клиенты отличаются друг от друга только координатами вывода на экран своих состояний - "работа вне обслуживания", "ожидание обслуживания", "обслуживание"
Procedure Server;
Begin
While True Do Begin
Monitor^.Waiting;
случайное время обслуживания клиента
End While;
End Server;
Procedure KeyManager;
Процедура KeyManager аналогична с задачами 3, 4 и 5
End KeyManager;
Begin
Monitor:= New(PMonitor, Init);
Создать процесс из процедуры Server;
Создать процесс из процедуры KeyManager;
Создать процесс из процедуры Client_1;
Создать процесс из процедуры Client_2;
Создать процесс из процедуры Client_3;
Начать работу ядра;
Dispose(Monitor, Done);
End Lab6.
Структура метода TMonitor.Request, который выполняется клиентом, может быть представлена следующим образом:
If Сервер свободен Then Begin
Активизация сервера;
End If;
Встать в очередь ожидания обслуживания;
Передача управления;
Структура метода TMonitor.Waiting, который выполняется сервером, может выглядеть следующим образом:
If Обслужен процесс Then Begin
Активизировать обслуженный процесс;
End If;
If Нет клиентов, запрашивающих обслуживание Then Begin Блокирование процесса-сервера;
Передача управления;
End If;
Перевод процесса, первого в очереди ожидания обслуживания, в очередь обслуживаемых процессов;
Учащемуся предстоит реализовать программу, выводя на экран состояния всех процессов и время, оставшееся до перехода в другое состояние.