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

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

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

Лабораторная работа №4 по курсу

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

ИССЛЕДОВАНИЕ СИСТЕМНЫХ ОЧЕРЕДЕЙ МНОГОЗАДАЧНОГО ЯДРА

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

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

Выполнили:

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

Захаров Илья

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

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

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

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

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

Цель работы - изучение системных очередей многозадачного ядра.

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

Самой важной системной очередью ядра является очередь готовых процессов, рассмотренная в лабораторной работе 3. В данной работе рассмотрим другие очереди ядра, которые принято относить к системным.

Очередь задержанных процессов

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

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

Type List = Object First : Process; Constructor Init; Destructor Done; Virtual; Procedure Insert(P : Process); Procedure Remove(P : Process); End {List}.

Очередь процессов, задержанных на время

Данный объект выполняет функции классической временной задержки выполнения программы, например: Delay(T : Word), которая обеспечивает "активное" ожидание, допустимое в однозадачной среде. В многозадачной среде при необходимости задержать процесс на время его целесообразно извлечь из очереди готовых и тем самым распределять процессорное время уже между меньшим числом процессов.

Технология реализации очереди, выполняющей функции задержки процессов на время, основана на следующих положениях:

1. Мультизадачная среда "знает" текущее время, которое может подсчитываться по количеству вызовов диспетчера-обработчика прерываний от таймера.

2. В момент обращения процесса к методу "задержать на время Т" процесс переводится в очередь, а в специальное поле дескриптора процесса заносится время его активизации, равное сумме текущего времени и интервала Т задержки.

3. Диспетчер на каждом прерывании проверяет очередь задержанных на наличие процессов, для которых текущее время совпало с временем их активизации, и переводит эти процессы в очередь готовых.

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

Type DelayList = Object(List) Procedure Delay(T : Word); Procedure Activisation; End {DelayList}. Метод DelayList.Activisation помещается в диспетчер.

Дадим словесное описание метода DelayList.Delay(T : Word).

Procedure DelayList.Delay(T : Word); Var Предыдущий : Процесс; Begin Предыдущий := Текущий; Предыдущий^.Tact := T + Tcur; Включить(Предыдущий); Текущий := Очередь_Готовых.Первый; Очередь_Готовых.Извлечь(Текущий); Передать_Управление(Предыдущий, Текущий); End {DelayList.Delay}. Дадим словесное описание метода DelayList.Activisation:

Procedure DelayList.Activisation; Var Текущий, Следующий : Процесс; Begin Текущий := Первый; While Текущий <> NIL do Begin Следующий := Текущий^.Следующий; If Текущий^.Tact = Tcur then Begin Извлечь(Текущий); Очередь_Готовых.Включить(Текущий); End; {If} Текущий := Следующий; End; {While} End {DelayList.Activisation}.

Очередь уничтожаемых процессов

Чтобы уничтожить процесс, находящийся в какой-либо очереди, его необходимо изъять из нее и разрушить дескриптор процесса. При этом никаких проблем не возникает. Они появляются, когда требуется уничтожить активный процесс, т.е. выполняющийся в текущий момент времени. Например, процесс закончил выполнение предписанных ему действий и желает самоуничтожиться. В этом случае просто разрушить дескриптор процесса нельзя, так как управление от активного процесса передается первому в очереди готовых процессов через их дескрипторы, и если дескриптор активного процесса разрушить, то функции Transfer(Old, New : Process) будет передан указатель на несуществующий дескриптор и система зависнет.

Поэтому технология корректного уничтожения процесса состоит в следующем:

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

2. Диспетчер на каждом прерывании очищает очередь уничтожаемых процессов, разрушая их дескрипторы.

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

Type KillList = Object(List) Procedure SelfInsert; Procedure Clear; End {KillList}. Метод KillList.Clear вызывается из процедуры диспетчера на каждом прерывании от таймера.

Дадим словесное описание метода KillList.Clear.

Procedure KillList.Clear; Var Временный : Процесс; Begin While Первый <> NIL do Begin Временный := Первый; Первый := Временный^.Следующий; Разрушить(Временный); End {Пока}; End {KillList.Clear}. Примитив ядра УНИЧТОЖИТЬ_ПРОЦЕСС(P : ПРОЦЕСС) выглядит следующим образом KillList.Insert(P).

При самоуничтожении процесс должен обратиться к методу: KillList.SelfInsert.

Заметим, что процесс никогда не должен заканчиваться выходом на End процедуры, которая его описывает, а только вызовом KillList.SelfInsert.

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

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

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

3. Реализовать программу, демонстрирующую работоспособность разработанных объектов.

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

5