
Научно исследовательский институт Высшая школа экономики
Московский государственный институт электроники и математики (Технический университет)
Кафедра информационных и автоматизированных систем
Отчет по лабораторным работам Группа __АП-32__
|
|
Выполнил студентка __Стахи Алина __ (ФИО)
|
Руководитель __Витушкин П.И . (ФИО)
|
МОСКВА 2012
|
Лабораторная работа №1. «Программная реализация средств представления и управления процессами в многопрограммных ОС».
Постановка задачи
При выполнении лабораторной работы необходимо разработать алгоритм и составить программу, имитирующую работу простейшей ОС, (в дальнейшем будем называть ее "системой"), которая должна выполнять перечисленные ниже действия:
– формирование дескрипторов процессов, вводимых в "систему";
– определение состояний, в котором находятся все известные "системе" процессы;
– формирование и ведение списочных структур ("очередей") дескрипторов на основании их состояний, приоритетов и используемой дисциплины диспетчеризации;
Структура программы
Программа содержит:
#include <vcl.h>
#pragma hdrstop
#include "Process.h"
#include <cstdlib>
#include <iostream>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int n=-1,j=0,flag=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::InpNum(char &Key)
{
if ((Key>='0')&&(Key<='9')) return;
if (Key==DecimalSeparator){
if ((Edit1->Text).Pos(DecimalSeparator)!=0) Key=0; return;}
if (Key==VK_BACK) return;
if (Key==VK_RETURN) {Edit2->SetFocus(); return;}
Key=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int i;
AnsiString c;
if (Edit2->Text!=NULL&&Edit3->Text!=NULL) {
if (StrToInt(Edit3->Text)<StrToInt(Edit5->Text)){
n++;
Edit5->Text=IntToStr(StrToInt(Edit5->Text)-StrToInt(Edit3->Text));
Edit6->Text=IntToStr(StrToInt(Edit6->Text)+StrToInt(Edit3->Text));
ListBox1->Items->Add(Edit1->Text);
ListBox2->Items->Add(Edit2->Text);
ListBox3->Items->Add(Edit3->Text);
ListBox4->Items->Add("0");
ListBox5->Items->Add("ready");
Edit1->Text='\0';
Edit2->Text='\0';
Edit3->Text='\0';
for (i=0;i<n-1;i++)
{
if (StrToInt(ListBox2->Items->Strings[i])<StrToInt(ListBox2->Items->Strings[i+1]))
{
c=ListBox2->Items->Strings[i];
ListBox2->Items->Strings[i]=ListBox2->Items->Strings[i+1];
ListBox2->Items->Strings[i+1]=c;
}
}}}}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)
{
InpNum(Key);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key)
{
InpNum(Key);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit4KeyPress(TObject *Sender, char &Key)
{
InpNum(Key);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit7KeyPress(TObject *Sender, char &Key)
{
InpNum(Key);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit5KeyPress(TObject *Sender, char &Key)
{
InpNum(Key);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit6KeyPress(TObject *Sender, char &Key)
{
InpNum(Key);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
if (n>=0){
Edit5->Text=IntToStr(StrToInt(Edit5->Text)+StrToInt(ListBox3->Items->Strings[ListBox5->ItemIndex]));
Edit6->Text=IntToStr(StrToInt(Edit6->Text)-StrToInt(ListBox3->Items->Strings[ListBox5->ItemIndex]));
ListBox1->Items->Delete(ListBox1->ItemIndex);
ListBox2->Items->Delete(ListBox2->ItemIndex);
ListBox3->Items->Delete(ListBox3->ItemIndex);
ListBox4->Items->Delete(ListBox4->ItemIndex);
ListBox5->Items->Delete(ListBox5->ItemIndex);
n--;
}}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox2Click(TObject *Sender)
{
ListBox1->ItemIndex=ListBox2->ItemIndex;
ListBox3->ItemIndex=ListBox2->ItemIndex;
ListBox4->ItemIndex=ListBox2->ItemIndex;
ListBox5->ItemIndex=ListBox2->ItemIndex;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox3Click(TObject *Sender)
{
ListBox1->ItemIndex=ListBox3->ItemIndex;
ListBox2->ItemIndex=ListBox3->ItemIndex;
ListBox4->ItemIndex=ListBox3->ItemIndex;
ListBox5->ItemIndex=ListBox3->ItemIndex;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox4Click(TObject *Sender)
{
ListBox1->ItemIndex=ListBox4->ItemIndex;
ListBox2->ItemIndex=ListBox4->ItemIndex;
ListBox3->ItemIndex=ListBox4->ItemIndex;
ListBox5->ItemIndex=ListBox4->ItemIndex;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
ListBox2->ItemIndex=ListBox1->ItemIndex;
ListBox3->ItemIndex=ListBox1->ItemIndex;
ListBox4->ItemIndex=ListBox1->ItemIndex;
ListBox5->ItemIndex=ListBox1->ItemIndex;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
ListBox5->Items->Strings[ListBox5->ItemIndex]="freeze";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox5Click(TObject *Sender)
{
ListBox1->ItemIndex=ListBox5->ItemIndex;
ListBox2->ItemIndex=ListBox5->ItemIndex;
ListBox3->ItemIndex=ListBox5->ItemIndex;
ListBox4->ItemIndex=ListBox5->ItemIndex;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
if (ListBox5->Items->Strings[ListBox5->ItemIndex]=="freeze")
ListBox5->Items->Strings[ListBox5->ItemIndex]="ready";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
AnsiString c;
c=ListBox2->Items->Strings[1];
ListBox2->Items->Strings[1]=ListBox2->Items->Strings[0];
ListBox2->Items->Strings[0]=c;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (ListBox5->Items->Strings[j]=="active") {
ListBox5->Items->Strings[j]="ready";
ListBox4->Items->Strings[j]=IntToStr(StrToInt(ListBox4->Items->Strings[j])+1);
j++;}
if (j<=n) while (j<=n&&ListBox5->Items->Strings[j]!="ready") j++;
if (j>n) j=0; else if (ListBox5->Items->Strings[j]=="ready") ListBox5->Items->Strings[j]="active";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
for (i=0;i<10;i++){
Sleep(200);
if (ListBox5->Items->Strings[j]=="active") {
ListBox5->Items->Strings[j]="ready";
ListBox4->Items->Strings[j]=IntToStr(StrToInt(ListBox4->Items->Strings[j])+1);
j++;}
if (j<=n) while (j<=n&&ListBox5->Items->Strings[j]!="ready") j++;
if (j>n) j=0; else if (ListBox5->Items->Strings[j]=="ready") ListBox5->Items->Strings[j]="active";}
}
//---------------------------------------------------------------------------
Контрольные вопросы к Л.Р. №1.
Процесс – абстракция, вводимая для описания механизма функционирования ОС. ОС рассматривает процессы как единицы, между которыми необходимо распределить и перераспределять ресурсы ВС. В силу естественной ограниченности ресурсов ВС не все запросы на использование ресурсов, выдаваемые различными процессами, могут быть удовлетворены сразу после их поступления к ОС. Это является причиной того, что процессы, кроме всего прочего, отличаются друг от друга тем, в какой степени и на какие ресурсы их запросы удовлетворены; последнее, а также статус и характер использования программы, о которой ассоциируется данный процесс, определяет состояние процесса. По мере удовлетворения запросов ресурсов, процесс переходит из одного состояния в другое. Причиной изменения состояний процессов в разработанной системе является команда пользователя.
Выбор (имя процесса): готовность -> выполнение
Истечение _кванта (имя процесса): выполнение -> готовность
Запрос_ресурса (имя процесса, вид ресурса): выполнение -> ожидание_ресурса.
Выделение_ресурса (имя процесса, вид ресурса):ожидание_ресурса -> готовность.
Состояния процессов и возможные переходы.
Пассивные состояния
Активные состояние
Запуск
Приостановка
Порождение
Возобновление
Прекращение
Удаление
Завершение
3. Переход процессов из одного состояния в другое
ГотовностьВыполнение
Выбор
Запуск
Завершение
Истеч.
кванта
Выделение
ресурса Запрос
ресурса
П
Ожидание
риостановка/
П
рекращение
В озобновление
Выполнение операций диспетчеризации инициируется пользователем путем нажатия на управляющие кнопки.
Краткое описание команд взаимодействия:
1.Создать - создание дескриптора процесса с параметрами, указываемыми пользователем. Проверяется корректность введенных параметров, если все верно, создается запись, которая помещается в соответствии с параметрами в определенную очередь.
2. Завершить активный процесс – перевод активного процесса в состояние «завершен» при нажатии пользователем на соответствующую кнопку. Затем определяется тот процесс, из очереди готовых, который следующим перейдет в состояние выполнения.
3. Изменить приоритет активного процесса – указав новый приоритет процесса пользователь может присвоить это значение приоритета активному процессу.
4. Запрос операции ввода\ вывода – необходимо указать номер процесса, который должен потребовать операцию ввода\вывода, затем, указать номер процесса, которому выделили ресурс ввода\вывода\
5. Квант времени – нажатие на эту кнопку аналогично истечению кванта времени при работе ЦП. Активный процесс переводится в пассивное состояние, среди готовых процессов выбирается процесс, который следующим будет переведен в активное состояние.
Л.Р. № 2«Изучение дисциплин диспетчеризации процессов в многопрограммных ос»
Контрольные вопросы к Л.Р. №2.
1. Чем продолжительнее квант времени, тем дольше ЦП обрабатывает один процесс. Остальные процессы в это время будут находиться в состоянии готовности или ожидания, будут ждать освобождения ЦП.
2. При выполнении операции Выбор процесс, дескриптор которого расположен в начале i-той очереди (1<=i<=n), будет помещен в состояние выполнение только в том случае, если все очереди от первой до (i-1)-ой – пустые. Выполнение выбранного процесса будет осуществляться в течение кванта времени (если, конечно, не произойдет операция диспетчеризации Запрос_ресурса, Завершение или какая-либо другая операция планирования процессов в отношении данного выполняемого процесса). После истечения кванта времени, вследствие выполнения операции диспетчеризации Истечение_кванта времени ЦП произойдет перевод процесса из состояния выполнение в состояние готовность и его дескриптор поступает в конец очереди с номером i+1.
Последующая за этим операция Выбор переведет в состояние выполнение тот процесс, дескриптор которого стоит в начале очереди с самым младшим номером. Таким процессом может оказаться процесс, дескриптор которого стоял следующим в очереди i или в очереди i+1 (при условии, что после выбора процесса из очереди i последняя оказалась пустой). Дескриптор процесса, переводимого из пассивного состояния в активное (с помощью операции Запуск), поступает в первую очередь (i=1). Если это имеет место быть, после окончания кванта времени ЦП, выделенного для выполнения процесса из очереди i, будет осуществлен запуск процесса, дескриптор которого помещен в очередь номер 1.
Данная схема обеспечивает быстрое выполнение наиболее коротких процессов.
3. Недостаток данной схемы диспетчеризации заключается в непроизводительных расходах процессорного времени на перемещение дескрипторов процессов из одной очереди и другую.
Лабораторная работа № 3. "Реализация дисциплин диспетчеризации процессов с учетом приоритетов".