Методические указания к лабораторным работам по дисциплине
"АВТОМАТИЗИРОВАННЫЕ СИСТЕМЫ УПРАВЛЕНИЯ РЕАЛЬНОГО ВРЕМЕНИ"
ОБЩАЯ ХАРАКТЕРИСТИКА ЗАДАНИЙ
Все задания, представленные ниже, представляют собой задачи на организацию доступа к общему (разделяемому, критическому) ресурсу некоторого числа параллельных процессов. Для практической реализации заданий следует использовать библиотечный модуль MultiObj, являющийся ядром управления параллельными процессами в среде MS DOS.
Для управления доступом к общему ресурсу следует создать объект - монитор. Монитор состоит из множества переменных состояния и множества процедур, которые используют эти переменные. Некоторые из этих процедур, называемые внешними, доступны пользователю и называются точками входа в монитор. Процессы, которые используют монитор для синхронизации, не имеют прямого доступа к переменным состояния. Они могут воспользоваться монитором только путем вызова внешних процедур. Процедуры монитора включают операции, которые позволяют блокировать и активизировать процессы в соответствие со спецификацией задачи. Условия установки и снятия блокировки записываются в виде функций переменных состояния и механизм работы монитора гарантирует, что все преобразования этих переменных происходят при взаимном исключении.
Монитор имеет следующее общее описание (в терминах объектно-ориентированного языка 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, являющаяся экземпляром указанного объекта.
Количество различающихся методов входа в критический участок и методов выхода из него определяется количеством разновидностей процессов в каждой прикладной задаче.
В каждой из перечисленных ниже задач требуется создать свой монитор и запрограммировать его, используя ядро MultiObj. Методика решения каждой задачи, приведенная в разделе "Методика
решения", ориентирована на использование ядра MultiObj. Основой решения каждой задачи является формирование и формализация условий входа в критический участок и условий активизации ждущих
процессов при выходе из критического участка.
Методика решения задачи 1 рассмотрена более подробно, чем остальных задач. Методика решения каждой задачи предлагает один выриант решения, что конечно же, не исключает возможности решения задачи с помощью других алгоритмов. Для тех, кто затрудняется создать свой монитор, рекомендуется запрограммировать условия, предлагаемые в методике решения каждого задания.
Предполагается, что для решения задач группа разбивается на бригады по 2 - 3 человека и программирует задачи по типу лабораторных работ. Практическое решение каждой задачи
оформляется в виде отчета (одного на бригаду). Отчет должен содержать:
- спецификацию задачи;
- обоснование условий входа в критический участок и активизации ждущих процессов при выходе из него для каждой разновидности процессов;
- текст программы с комментариями.
Требования к программам, реализующим задания:
- программа должна выглядеть как законченный продукт – иметь меню, иметь Помощь, описывающую программу и правила работы с ней, и функционирующую хотя бы вне мультизадачного режима, иметь средства, отображающие на экране действия и состояния всех
процессов.
К тексту задания прилагается текстовый файл мультизадачного объектноориентированного ядра MultiObj.Pas, с помощью которого необходимо реализовать программы заданий. Объекты ядра допустимо перекрывать при необходимости.
Прилагается также простейший вариант реализации задачи 1 в качестве примера.
Задача 1. МОДЕЛЬ ЖЕЛЕЗНОДОРОЖНОГО ПЕРЕГОНА
Железная дорога, соединяющая два города А и В, включает участок, на котором имеется только единственный путь, см. схему.
Движение поездов на единственном пути подчиняется следующим ограничениям:
- на свободный единственный путь может войти поезд любого направления;
- пока на единственном пути находится поезд некоторого направления, на него не может войти поезд другого направления, но может войти поезд того же направления.
--->--------¬ ------>----
v ^
А +----->------<------+ B
v ^
---<--------- L-----<----
Требуется запрограммировать задачу, написав монитор, для двух вариантов условий:
1) нет ограничений на количество поездов одного направления, находящихся на единственном пути;
2) ограничить количество поездов одного направления, находящихся на единственном направлении значением N и решить проблему "бесконечного ожидания", свойственную первому варианту, когда поезда одного направления, захватив единственный путь, не позволяют поездам другого направления пройти по этому пути. При этом необходимо реализовать рациональный порядок выделения единственного пути поездам обоих направлений.
Методика решения
В данной задаче "единственный путь" является общим ресурсом для поездов, которые должны моделироваться процессами. Регламентация доступа процессов к этому общему ресурсу осуществляется средством "монитор".
Поскольку в задаче имеется два вида процессов - поезда, движущиеся слева направо, и поезда, движущиеся справа налево, то методов входа в критический участок и выходов из него будет в мониторе по два, на каждый вид процесса, то есть внутри объекта TMonitor должны быть объявлены следующие методы:
Procedure Enter_L_R; {вход поезда, движущегося слева направо, в критический участок}
Procedure Enter_R_L; {вход поезда, движущегося справа налево, в критический участок}
Procedure Exit_L_R; {выход поезда, движущегося слева направо, из критического участка}
Procedure Exit_R_L; {выход поезда, движущегося справа налево, из критического участка}.
Методы входа проверяют условия входа в критический участок. При выполнении этих условий процесс продолжает выполняться, входя в критический участок, а при невыполнении - процесс приостанавливается в очереди. При этом в обоих случаях устанавливаются необходимые данные, например, увеличивается количество движущихся в критическом участке поездов данного направления или увеличивается количество ждущих входа в критический участок поездов данного направления.
Методы выхода проверяют условия возможной активизации блокированных процессов, активизируют их при выполнении этих условий и устанавливаю необходимые данные, например, уменьшают количество движущихся в критическом участке поездов данного направления и уменьшают количество ждущих поездов.
Условия блокировки и активизации процессов-поездов позволяют определить те данные, которые необходимо анализировать в мониторе, а именно,
- количество поездов, движущихся по единственному пути слева направо, Nmlr;
- количество поездов, движущееся по единственному пути справа налево, Nmrl;
- количество поездов, ждущих входа на единственный путь слева направо, Nwlr;
- количество поездов, ждущих входа на единственный путь справа налево, Nwrl.
Кроме того, при ожидании выполнения условий входа на единственный путь процесс должен находиться в специально созданной для этого очереди. Поэтому в качестве данных в мониторе должны существовать следующие переменные:
R_L_List - очередь, в которой ждут освобождения единственного пути поезда, движущиеся справа налево;
L_R_List - очередь, в которой ждут освобождения единственного пути поезда, движущиеся слева направо.
C учетом приведенных выше описаний данных и методов объекта "Монитор" можно представить следующую структуру программы, реализующей задание:
Program Lab1;
Uses MultiObj;
Type
PMonitor = ^TMonitor;
TMonitor = Object
Nmlr,
Nmrl,
Nwlr,
Nwrl : Word;
L_R_List,
R_L_List : TList;
Constructor Init;
Destructor Done; Virtual;
Procedure Enter_L_R;
Procedure Enter_R_L;
Procedure Exit_L_R;
Procedure Exit_R_L;
End {TMonitor};
{--Реализация методов монитора возлагается на учащегося--}
Var
Monitor : PMonitor;
Procedure L_R_Train;
Begin
{движение до входа в критический участок}
Monitor^.Enter_L_R;
{движение в критическом участке}
Monitor^.Exit_L_R;
{движение после выхода из критического участка}
{самоуничтожение}
End {L_R_Train};
Procedure R_L_Train;
Begin
{движение до входа в критический участок}
Monitor^.Enter_R_L;
{движение в критическом участке}
Monitor^.Exit_R_L;
{движение после выхода из критического участка}
{самоуничтожение}
End {R_L_Train};
Procedure KeyManager;
Begin
While True Do Begin
If Клавиша нажата Then Begin
Чтение клавиши;
Case Клавиша Of
'Esc' : Остановить работу ядра;
'L','l' : Создать процесс из процедуры L_R_Train;
'R','r' : Создать процесс из процедуры R_L_Train;
Else