Диспетчер с абсолютным круговым приоритетом

Дата добавления: 29 Февраля 2012 в 07:30
Автор: a********************@yandex.ru
Тип работы: курсовая работа
Скачать полностью (84.85 Кб)
Работа содержит 1 файл
Скачать  Открыть 

отчетСРВ.doc

  —  138.00 Кб


МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

 

 

 

 

 

 

 

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

по  дисциплине: «Системы реального времени»

на тему: «Диспетчер с абсолютным круговым приоритетом»

 

 

 

 

Выполнил:

Проверила:

Глушкова И.И.

 

 

 

 

 

 

 

 

 

Улан-Удэ, 2012 г.


Постановка задачи

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

 

Теоретическая часть

Диспетчер с абсолютным приоритетом

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

Вычислительный процесс – последовательность выполнения команд программы.

{P1, P2, P3, . . . . . , Pn} множество процессов, составленных в соответствии с множеством {D1, D2, D3, . . . . , Dn} дескрипторов.

В качестве среды программирования был выбран Builder C++, в качестве механизма реализации диспетчера – списки из классов, использующиеся в C++. В общем, в программе используется один класс, обозначающий процесс. Этот класс имеет такие свойства как id процесса, время выполнения процесса и его приоритет. Для реализации диспетчера в класс также добавлен указатель на следующий класс – по умолчанию там стоит NULL, но для реализации списка его можно инициализировать.

Для простоты id процесса каждый раз генерируется автоматически, а приоритет и время работы можно как генерировать автоматически, так и вводить с клавиатуры. Список из процессов, изображающий диспетчер, отображается в компоненте Memo1. А действия, выполняемые диспетчером (перетасовка процессов, удаление процессов из списка процессов), отображаются в компоненте Memo2. Также на форме программы присутствуют два таймера – один с задержкой в секунду, второй с задержкой в десять секунд. Первый таймер отвечает за выполнение процессов, уменьшая время работы текущего процесса на секунду за каждый свой ход. Если проходит один ход у второго таймера, то текущий процесс переносится в конец списка, но если текущий процесс закончится до выполнения ход у таймера, то время второго таймера обнуляется и он запускается снова с десяти секунд – таким образом реализуется квант времени.

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

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


Экспериментальная часть

В качестве входных условий выбрано три процесса (с приоритетом 3), все с приоритетом три, затем во время выполнения процесса с id 0, добавляется еще один процесс с приоритетом 2. Ход работы диспетчера в данном случае описан в компоненте Memo2, а результат работы программы изображен на рисунке 1 (пример сверху)

 

Рисунок 1. – Тестирование программы

 

Другой пример демонстрирует добавление процесса с наивысшим, по отношению к текущему, приоритетом. Ход работы диспетчера при таком тестировании описан в компоненте Memo2, а результат работы программы изображен на Рисунке 1 (снизу).


Вывод

Программный продукт спроектирован в среде программирования Builder C++ и реализует диспетчер с абсолютным круговым приоритетом через стандартную реализацию классов и списков в C++. Написанная программа отличается надежностью и высокой скоростью выполнения, вкупе с содержательным наполнением и удобным оформлением. Данная лабораторная работа хорошо показывает что программа, целиком и полностью реализует все свойства систем реального времени, при добавлении нового процесса диспетчер сравнивает его приоритет с приоритетами других процессов и назначает очередь в соответствии с его приоритетом.


Листинг

//---------------------------------------------------------------------------

#include <vcl.h>

#include <conio.h>

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)

{}

//---------------------------------------------------------------------------

int START = 1;

int w = 0;

//--------------------------------------------------------------------------

class process

{

        public:

        int id, time, priority, step;

        process *next;

        process(int x, int y)

        {

                id = x;

                priority = y;

                time = 10+random(10);

                step = 1000 / time;

                x++;

                if (y>0)

                        y=y-(random(2));

                if (x<START)

                        next = new process(x, y);

                else

                        next = NULL;

        }

};

//---------------------------------------------------------------------------

process *newproc = new process(0,3);

int ID = START;

int CURRENT = START;

//---------------------------------------------------------------------------

void output_starter()

{

        Form1->Memo1->Clear();

        if (newproc != NULL)

        {

                process *x = newproc;

                Form1->pbar->Position = 1000 - x->time*(x->step);

                for (int i=0; i<CURRENT; i++)

                {

                        Form1->Memo1->Lines->Add("Ïðîöåññ ¹"+IntToStr(x->id)+", ñ ïðèîðèòåòîì "+IntToStr(x->priority)+".");

                        x = x->next;

                }

        }

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

   AddButton->Enabled = false;

   Timer1->Enabled = false;

   Timer2->Enabled = false;

   Timer3->Enabled = false;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

   if ((Edit1->Text).Length() != 0)

   {

    int chislo = StrToInt(Edit1->Text);

    output_starter();

        process *x = newproc;

        Form1->Memo2->Lines->Add("Ðåñóðñ çàõâàòèë ïðîöåññ ¹"+IntToStr(x->id)+" ñ ïðèîðèòåòîì "+IntToStr(x->priority)+".");

        Form1->Label2->Caption = "Ïðîöåññ ¹" +  IntToStr(x->id);

        Timer1->Enabled = true;

        Timer2->Enabled = true;

        Timer3->Enabled = true;

        AddButton->Enabled = true;

    for(int i = 0; i <(chislo-START); i++)

    {

        if (AddButton->Tag == 1)

        {

                Timer1->Enabled = False;

                int y = 1 + random(3);

                if (prioritye->Text != "")

                        y = StrToInt(prioritye->Text);

                process *add = new process(START,y);

                add->id = ID;

                Form1->Memo2->Lines->Add("Äîáàâëåí ïðîöåññ ¹"+IntToStr(add->id)+" ñ ïðèîðèòåòîì "+IntToStr(add->priority)+".");

                ID++;

                CURRENT++;

                if (timee->Text != "")

                        add->time = StrToInt(timee->Text);

                else

                        add->time = 10+random(10);

                if (newproc != NULL)

                {

                        if (newproc->priority < y)

                        {

                                Timer2->Enabled = False;

                                Form1->Memo2->Lines->Add("Âûòåñíåí ïðîöåññ ¹"+IntToStr(newproc->id)+" ñ ïðèîðèòåòîì "+IntToStr(newproc->priority)+".");

                                process *f = newproc;

                                newproc = add;

                                newproc->next = f;

                                Timer2->Enabled = True;

                        }

                        else

                        {

                                process *x = newproc;

                                while (x->priority > y)

                                {

                                        if (x->next == NULL)

                                        {

                                                x->next = add;

                                                break;

                                        }

                                        x = x->next;

                                }

                                if (x->next != add)

                                {

                                        process *b = x->next;

                                        x->next = add;

                                        add->next = b;

                                }

                        }

                }

                else

                        newproc = add;

                output_starter();

                Timer1->Enabled = True;

        }

    }

    Form1->Button1->Enabled = false;

 

   }

   else

   {

    MessageDlg("Íàäî ââåñòè öåëîå ÷èñëî",

    mtInformation, TMsgDlgButtons() << mbOK, 0);

   }

}

//---------------------------------------------------------------------------

void __fastcall TForm1::AddButtonClick(TObject *Sender)

{

        if (AddButton->Tag == 1)

        {

                Timer1->Enabled = False;

                int y = 1 + random(3);

                if (prioritye->Text != "")

                        y = StrToInt(prioritye->Text);

                process *add = new process(START,y);

                add->id = ID;

                Form1->Memo2->Lines->Add("Äîáàâëåí ïðîöåññ ¹"+IntToStr(add->id)+" ñ ïðèîðèòåòîì "+IntToStr(add->priority)+".");

                ID++;

                CURRENT++;

                if (timee->Text != "")

                        add->time = StrToInt(timee->Text);

                else

                        add->time = 10+random(10);

                if (newproc != NULL)

                {

                        if (newproc->priority < y)

                        {

                                Timer2->Enabled = False;

                                Form1->Memo2->Lines->Add("Âûòåñíåí ïðîöåññ ¹"+IntToStr(newproc->id)+" ñ ïðèîðèòåòîì "+IntToStr(newproc->priority)+".");

                                process *f = newproc;

                                newproc = add;

                                newproc->next = f;

                                Timer2->Enabled = True;

                        }

                        else

                        {

                                process *x = newproc;

                                while (x->priority > y)

                                {

                                        if (x->next == NULL)

                                        {

                                                x->next = add;

                                                break;

                                        }

                                        x = x->next;

                                }

                                if (x->next != add)

                                {

                                        process *b = x->next;

                                        x->next = add;

                                        add->next = b;

                                }

                        }

                }

                else

                        newproc = add;

                output_starter();

                Timer1->Enabled = True;

        }

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

        process *x = newproc;

        if (x != NULL)

        {

                if (x->time>0)

                {

                        x->time--;

                        pbar->Position = 1000 - x->time*(x->step);

                }

                else

                {

                        AddButton->Tag = 0;

                        Timer2->Enabled = False;

                        Form1->Memo2->Lines->Add("Âûïîëíèëñÿ ïðîöåññ ¹"+IntToStr(x->id)+" ñ ïðèîðèòåòîì "+IntToStr(x->priority)+".");

                        CURRENT--;

                        if(CURRENT == 0)

                        {

                                Timer3->Enabled = false;

                                Form1->Label2->Caption = " ";

                        }

                        x = x->next;

                        newproc = x;

                        if (x != NULL)

                        {

                                Form1->Memo2->Lines->Add("Íà÷àë âûïîëíÿòñÿ ïðîöåññ ¹"+IntToStr(x->id)+" ñ ïðèîðèòåòîì "+IntToStr(x->priority)+".");

 

                        }

                        output_starter();

                        Timer2->Enabled = True;

                        AddButton->Tag = 1;

                }

        }

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer2Timer(TObject *Sender)

{

if (newproc != NULL)

{

        Timer1->Enabled = False;

        AddButton->Tag = 0;

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