Операционные системы
Самостоятельная работа №1
Изучение алгоритмов реализации и использования сопрограмм
(моделирование принципов невытесняющей многозадачности)
Цель работы: ознакомление с алгоритмами реализации сопрограмм и способами их использования для организации многозадачности.
Общие сведения
Сопрограммы это средство прередачи управления из одной процедуры в другую без отношения вложенности. Выполняемой процедуре нет необходимости возвращаться в вызвавшую ее процедуру. Традиционные операторы ВЫЗОВ и ВОЗВРАТ в случае сопрограмм заменяются одним оператором – ПЕРЕДАТЬ_УПРАВЛЕНИЕ. Сопрограммы обладают следующими свойствами:
- позволяют имитировать параллельность с помощью явных передач управления;
- являются средством реализации многозадачного режима.
Реализация сопрограмм основана на выделении собственного стека для каждой из процедур. Тогда оператор ПЕРЕДАТЬ_УПРАВЛЕНИЕ по существу выполняет операцию замены стека приостанавливаемой сопрограммы на стек возобновляемой сопрограммы. Работа процедур в качестве сопрограмм требует предварительной подготовки, состоящей в выделении стека каждой из процедур и записи в стек точки входа в процедуру. Текущее состояние стека каждой из сопрограмм хранится в структуре, называемой ДЕСКРИПТОР_СОПРОГРАММЫ. Поэтому сопрограммы представляются своими дескрипторами.
Технология реализации и работы сопрограмм
Поскольку работа со стеком требует доступа непосредственно к регистрам SS и SP, оператор ПЕРЕДАТЬ_УПРАВЛЕНИЕ может быть реализован только средствами ассемблера.
Оформление ассемблерной процедуры в среде Pascal:
Procedure Name_Proc(Параметры-значения; Параметры-переменные);
Assembler; {обязательный атрибут}
Asm {обязательный атрибут}
...
End;
Запись в адресуемую ячейку памяти производится оператором
MemW[Seg:Ofs] := ...
Технология реализации сопрограмм представлена в форме описания последовательностей действий производимых при создании сопрограммы и при передаче управления от одной сопрограммы к другой.
Procedure СОЗДАТЬ_СОПРОГРАММУ;
Begin
ВЫДЕЛИТЬ ПАМЯТЬ ПОД СТЕК;
ВЫДЕЛИТЬ ПАМЯТЬ ПОД ДЕСКРИПТОР;
ВЫЧИСЛИТЬ АДРЕС "ДНА" СТЕКА И ЗАПИСАТЬ ЕГО В ДЕСКРИПТОР;
ПО АДРЕСУ "ДНА" СТЕКА ЗАПИСАТЬ ТОЧКУ ВХОДА В ПРОЦЕДУРУ;
End;
Procedure ПЕРЕДАТЬ_УПРАВЛЕНИЕ; Assembler;
Asm
СЧИТАТЬ АДРЕС ДЕСКРИПТОРА ПРИОСТАНАВЛИВАЕМОЙ СОПРОГРАММЫ;
ЗАПИСАТЬ В ЭТОТ ДЕСКРИПТОР СОСТОЯНИЕ СТЕКА;
СЧИТАТЬ АДРЕС ДЕСКРИПТОРА ВОЗОБНОВЛЯЕМОЙ СОПРОГРАММЫ;
ВОССТАНОВИТЬ СОСТОЯНИЕ СТЕКА ИЗ ЭТОГО ДЕСКРИПТОРА;
End;
Технология работы сопрограмм представлена в форме "заготовки" программы:
Program Cor;
Procedure СОЗДАТЬ_СОПРОГРАММУ;
Begin
...
End;
Procedure ПЕРЕДАТЬ_УПРАВЛЕНИЕ; Assembler;
Asm
...
End;
Procedure User_1;
Begin
while true do begin
...
ПЕРЕДАТЬ_УПРАВЛЕНИЕ; {в другую сопрограмму}
end;
End;
...
Procedure User_N;
Begin
while true do begin
...
if УСЛОВИЕ then {завершение выполнения}
ПЕРЕДАТЬ_УПРАВЛЕНИЕ {в главную программу}
else
ПЕРЕДАТЬ_УПРАВЛЕНИЕ; {в другую сопрограмму}
end;
End;
Begin
СОЗДАТЬ_СОПРОГРАММУ; {User_1}
...
СОЗДАТЬ_СОПРОГРАММУ; {User_N}
ПЕРЕДАТЬ_УПРАВЛЕНИЕ; {в одну из сопрограмм}
End.
Дополнительные материалы:
Задание
- Реализовать процедуры СОЗДАТЬ_СОПРОГРАММУ и ПЕРЕДАТЬ_УПРАВЛЕНИЕ по их спецификациям, представленным выше.
- Реализовать программу Cor, заменив словесные описания действий операторами языка Pascal.
- Нарисовать состояния стека сопрограммы при создании, приостановке и возобновлении.
- В разрабатываемой демонстрационной программе организовать динамическое выделение и освобождение памяти под дескрипторы и стеки сопрограмм.
- Реализовать сопрограммы, представив их в виде объектов, включающих следующие данные данные: адрес стека и значения регистров SS и SP, а также следующие методы: создания, уничтожения и передачи управления.