Учебная деятельность    

Операционные системы

Самостоятельная работа №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.

Дополнительные материалы:

 

Задание

  1. Реализовать процедуры СОЗДАТЬ_СОПРОГРАММУ и ПЕРЕДАТЬ_УПРАВЛЕНИЕ по их спецификациям, представленным выше.
  2. Реализовать программу Cor, заменив словесные описания действий операторами языка Pascal.
  3. Нарисовать состояния стека сопрограммы при создании, приостановке и возобновлении.
  4. В разрабатываемой демонстрационной программе организовать динамическое выделение и освобождение памяти под дескрипторы и стеки сопрограмм.
  5. Реализовать сопрограммы, представив их в виде объектов, включающих следующие данные данные: адрес стека и значения регистров SS и SP, а также следующие методы: создания, уничтожения и передачи управления.
Отчет должен содержать тексты программ с комментариями и рисунки, отражающие состояния стеков сопрограмм.