Автор: Пользователь скрыл имя, 29 Февраля 2012 в 07:30, курсовая работа
Спроектировать на любом высокоуровневом языке программирования диспетчер с абсолютным круговым приоритетом, с использованием классов и указателей.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
Лабораторная работа
по дисциплине: «Системы реального времени»
на тему: «Диспетчер с абсолютным круговым приоритетом»
Выполнил:
Проверила:
Глушкова И.И.
Улан-Удэ, 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("
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("
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("
ID++;
CURRENT++;
if (timee->Text != "")
add->time = StrToInt(timee->Text);
else
add->time = 10+random(10);
if (newproc != NULL)
{
if (newproc->priority < y)
{
}
else
{
}
}
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("
ID++;
CURRENT++;
if (timee->Text != "")
add->time = StrToInt(timee->Text);
else
add->time = 10+random(10);
if (newproc != NULL)
{
if (newproc->priority < y)
{
}
else
{
}
}
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("
CURRENT--;
if(CURRENT == 0)
{
}
x = x->next;
newproc = x;
if (x != NULL)
{
}
output_starter();
Timer2->Enabled = True;
AddButton->Tag = 1;
}
}
}
//----------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
if (newproc != NULL)
{
Timer1->Enabled = False;
AddButton->Tag = 0;
Информация о работе Диспетчер с абсолютным круговым приоритетом