Операционные системы
Самостоятельная работа №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, а также следующие методы: создания, уничтожения и передачи управления.