Скачиваний:
51
Добавлен:
01.05.2014
Размер:
47.1 Кб
Скачать

Санкт-Петербургский Государственный Электротехнический Университет

Кафедра: АСОИУ

Лабораторная работа №7

по курсу

«Операционные среды АСОИУ»

ИССЛЕДОВАНИЕ МЕТОДА ВЗАИМОДЕЙСТВИЯ ПРОЦЕССОВ С ПОМОЩЬЮ ОЧЕРЕДЕЙ СООБЩЕНИЙ

Преподаватель:

Широков Владимир Владимирович

Выполнили:

Студенты гр.9331

Захаров Илья

Мазманов Денис

Степуленок Денис

Студентка гр.9332

Воронкина Ирина

Санкт-Петербург 2003

Цель работы - изучение методов взаимодействия процессов с помощью очередей сообщений.

Общие сведения

Обмен сообщениями между процессами на основе буфера, рассмотренный в лабораторной работе 6, обладает рядом недостатков, а именно:

- ограничено (размером буфера) количество сообщений, помещаемых в буфер;

- сообщения переписываются в буфер и читаются из буфера, таким образом времена записи и чтения определяются типом (размером) сообщения и могут быть большими.

Поэтому в ряде операционных сред, а именно: UNIX, OS/2 существует другое средство обмена сообщениями, называемое очередью сообщений и включающее кроме нее еще и средства синхронизации записи и чтения.

В качестве последних выступают очереди процессов, пославших сообщение и ждущих его.

Дадим словесное описание методов записи и чтения сообщения, а затем опишем данное средство обмена сообщениями как объект операционной среды.

Запись сообщения включает в себя следующие действия:

- включение указателя на сообщение в очередь (обратим внимание, что именно указатель помещается в очередь, а не само сообщение, что существенно повышает скорость обмена);

- включение процесса, пославшего сообщение в очередь, тем самым процесс, пославший сообщение, блокируется до момента чтения его другим процессом;

- активизацию процесса, ждущего сообщения, если таковой имеется.

Чтение сообщения включает в себя следующие действия:

- блокировку процесса путем постановки его в очередь, если сообщения отсутствуют;

- чтение сообщения, если оно поступило;

- активизацию процесса, пославшего сообщение.

Таким образом, процесс, пославший сообщение, возобновит свое выполнение только после того, как его сообщение будет прочитано другим процессом.

Схематично взаимодействия процессов для случаев, когда обращение одного процесса к примитиву записи сообщения происходит раньше обращения другого процесса к примитиву чтения, и наоборот, представлены на рисунках:

Процесс 1 Процесс 2

-------+------¬ ¦

¦ Запись ¦ ¦

L------T------- ¦

¦Ожидание ¦

-------+------¬ --------+-------¬

¦Возобновление¦ ¦ Чтение ¦

L------T----------------------------------------L-------T--------

Процесс 1 подошел к примитиву записи раньше, чем процесс 2 подошел к примитиву чтения

Процесс 1 Процесс 2

¦ -------+------¬

¦ ¦Начало чтения¦

¦ L------T-------

¦ Ожидание ¦

--------+-------¬ -------+------¬

¦ Запись ¦ ¦Конец чтения¦

L-------T-----------------------------------------L------T-------

Процесс 1 подошел к примитиву записи позже, чем процесс 2 подошел к примитиву чтения

Средство обмена сообщениями, удовлетворяющее приведенному выше описанию, может быть представлено следующим образом:

ТPostBox = Object MessageList : TMessageList;{очередь указателей на сообщения} SendProcList : TList;{очередь процессов, пославших сообщения} WaitProcList : TList; {очередь процессов. ждущих сообщение} Constructor Init; Destructor Done; Virtual; Procedure PutMsg(M : Pointer); {послать сообщение} Function GetMsg : Pointer; {принять сообщение} End {TPostBox}.

Очередь указателей на сообщения имеет методы, очень похожие на методы процессов, за исключением того, что оперирует с типом данных Pointer, а не с типом данных Процесс.

Constructor TPostBox.Init; Begin MessageList.Init; SendProcList.Init; WaitProcList.Init; End {TPostBox.Init}; Destructor TPostBox.Done; Begin MessageList.Done; SendProcList.Done; WaitProcList.Done; End {TPostBox.Done}; Procedure TPostBox.PutMsg(M : Pointer); Var Предыдущий : Процесс; Begin Запретить_прерывания; MessageList.Insert(M); Предыдущий := Текущий; SendProcList.Insert(Предыдущий); If WaitProcList.Первый <> NIL Then Begin Текущий := WaitProcList.Первый; WaitProcList.Remove(Текущий); End Else Begin Текущий := Readylist.Первый; Readylist.Remove(Текущий); End {If}; Передать_управление(Предыдущий, Текущий); Разрешить_прерывания; End {TPostBox.PutMsg}; Function TPostBox.GetMsg : Pointer; Var M : Pointer; S,Предыдущий : Процесс; Begin Запретить_прерывания; If MessageList.Первый = NIL Then Begin Предыдущий := Текущий; WaitProcList.Insert(Предыдущий); Текущий := Readylist.Первый; Readylist.Remove(Текущий); Передать_управление(Предыдущий, Текущий); Запретить_прерывания; End {If}; M := MessageList.Первый; MessageList.Remove(M); GetMsg := M; S := SendProcList.Первый; SendProcList.Remove(S); Readylist.Insert(S); Разрешить_прерывания; End {TPostBox.GetMsg}. Представленный объект лишь моделирует в среде MS DOS работу очередей сообщений, реализованных в системах UNIX и OS/2, однако дает представление о путях решения задачи синхронизации записи и чтения сообщений разными процессами.

С точки зрения синхронизации записи и чтения, состоящей в том, что процессы возобновляют работу только после того, как запись и чтение завершены, представленный объект похож на механизм Рандеву языка реального времени Ада.

Содержание задания

1. Реализовать объект TPostBox средствами языка Pascal.

2. Прокомментировать каждую строчку объекта TPostBox.

3. Написать демонстрационную программу, иллюстрирующую функционирование объекта TPostBox.

Отчет должен содержать текст программы с комментариями и библиотечный модуль с реализацией очереди сообщений.

5