Uploaded by Alexey Kolosov

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ Дисциплина планирования Shortest Job Next. по курсу: Операционные системы

advertisement
ГУАП
КАФЕДРА № 51
ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
доц, к.т.н.
должность, уч. степень, звание
подпись, дата
Дехканбаев Д.С.
инициалы, фамилия
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ
Дисциплина планирования Shortest Job Next.
по курсу: Операционные системы
РАБОТУ ВЫПОЛНИЛ(А)
СТУДЕНТ
ГР.
экстернат
подпись, дата
Санкт-Петербург 2012
Лытвак А. П.
инициалы, фамилия
Алгоритм работы решения.
Цель данной лабораторной работы – разработка приложения, реализующего модель
планировщика процессов с использованием дисциплины планирования Shortest Job Next
без приоритетов. SJN (shortest job next — самая короткая работа — следующая) —
невытесняющая дисциплина, в которой наивысший приоритет имеет самый короткий
процесс. Для того, чтобы применять эту дисциплину, должна быть известна длительность
процесса — задаваться пользователем или вычисляться методом экстраполяции. Для
коротких процессов SJN обеспечивает лучшие показатели, чем RR, как по потерянному
времени, так и по штрафному отношению. SJN обеспечивает максимальную пропускную
способность системы — выполнение максимального числа процессов в единицу времени,
но показатели для длинных процессов значительно худшие, а при высокой степени
загрузки
системы
активизация
длинных
процессов
может
откладываться
до
бесконечности. Приложение поддерживает 2 режима работы – ручной и автоматический.
В ручном режиме пользователь задает небольшое количество процессов, результатом
выполнения становится сохраненная в текстовом файле таблица, в которой показан ID
процесса, активного на каждом кванте времени, статус процесса и общее время
нахождения в системе. В автоматическом режиме выполняется большое количество
процессов ( 1 000 000 ) и вычисляется среднее значение отношения времени выполнения к
времени нахождения в системе, Эти данные входят в отчет выполнения автоматического
режима.
Средства разработки и файл исходного кода.
В качестве языка реализации был выбран С (Стандарт <<С89 с дополнением 1>> или
<<C95>>) ,
В качестве средств разработки были использованы Code::Blocks (свободная
кроссплатформенная среда разработки) с компилятором GNU GCC (MinGW), текстовый
редактор Notepad ++.
Листинг файла исходного кода приложения:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#define MAX 10000
#define SIZE 100
#define COMPLETED 1
#define NOT_COMPLETED 0
struct SingularProcess
{
int runtime;
int runtime_Copy;
int id;
int time;
int isCompleted;
};
void InitializeProcess(struct SingularProcess *p, int r, int i)
{
p->runtime = r;
p->runtime_Copy = r;
p->id = i;
p->time = 0;
p->isCompleted = NOT_COMPLETED;
}
void CompleteProcess(struct SingularProcess* process)
{
process->isCompleted = COMPLETED;
}
void IncrementTime(struct SingularProcess *pr, int mod)
{
int i = 0, max = 0;
if(!mod)
max = SIZE;
else
max = mod;
for(i = 0; i < max; ++i)
{
if(!(pr+i)->isCompleted)
(pr + i)->time++;
}
}
int isCompleted(struct SingularProcess *proc)
{
if(proc->isCompleted)
return COMPLETED;
else
return NOT_COMPLETED;
}
int IsAllCompleted(struct SingularProcess *prc, int mode)
{
int i = 0, max = 0;
if(!mode)
max = SIZE;
else
max = mode;
for(i = 0; i < max; ++i)
{
if(!(prc+i)->isCompleted)
{
return 0;
}
}
return MAX;
}
void AutoMode()
{
FILE *y;
y=fopen("data.txt","w");
int i = 0, cnt = 0;
double average = 0, total_time =0;
printf("Please wait, working ");
for(i = 0; i < MAX; ++i)
{
struct SingularProcess *processes;
processes = (struct SingularProcess*)malloc(sizeof(struct SingularProcess)*SIZE);
int j = 0;
for(j = 0; j < SIZE; ++j)
{
struct SingularProcess temp_Process;
int temp_runtime;
temp_runtime = rand() % 50;
InitializeProcess(&temp_Process, temp_runtime, cnt++);
processes[j] = temp_Process;
}
int c = 0;
for(c = 0; c < SIZE; ++c)
{
if(!(processes + c)->runtime)
CompleteProcess(processes + c);
}
while(!IsAllCompleted(processes, 0))
{
int shortest = MAX, k, shortest_Index;
for(k = 0, shortest_Index = 0; k < SIZE; ++k)
{
if((processes + k)->runtime < shortest && !isCompleted(processes+k) && (processes +
k)->runtime > 0)
{
shortest = (processes + k)->runtime;
shortest_Index = k;
}
}
(processes + shortest_Index)->runtime--;
IncrementTime(processes, 0);
if(!(processes + shortest_Index)->runtime)
{
CompleteProcess(processes + shortest_Index);
}
}
int y = 0;
for(y = 0; y < SIZE; ++y)
{
average += (processes + y)->runtime_Copy;
total_time += (processes +y)->time;
}
if(i % (MAX/25) == 0 && i >= MAX/25)
printf(". ");
free(processes);
}
fprintf(y,"\nAll operations finished, 1 million processes has been executed\nwith total time =
%.0f\n", total_time);
fprintf(y,"Average value for all processes is: %f \n",average/total_time);
fclose(y);
system("cls");
system("data.txt");
}
void ManualMode()
{
FILE *f;
f=fopen("data.txt","w");
int n = 0, total_time = 0;
printf("Input quantity of processes to execute (min 1, max 5): ");
scanf("%d", &n);
if(n < 1 || n > 5)
{
getchar();
return;
}
struct SingularProcess* processes;
processes = (struct SingularProcess*)malloc(sizeof(struct SingularProcess)*n);
int i = 0, cnt = 0;
for(i = 0; i < n; ++i)
{
int temp_Runtime = 0;
printf("Please input runtime of %d process (min 1, max 10): ", i+1);
scanf("%d", &temp_Runtime);
if(temp_Runtime < 1 || temp_Runtime > 10)
{
printf("Invalid input value!\n");
getchar();
return;
}
InitializeProcess((processes + i), temp_Runtime, cnt++);
}
while(!IsAllCompleted(processes, n))
{
int shortest = MAX, k, shortest_Index;
for(k = 0, shortest_Index = 0; k < n; ++k)
{
if((processes + k)->runtime < shortest && !isCompleted(processes+k) && (processes +
k)->runtime > 0)
{
shortest = (processes + k)->runtime;
shortest_Index = k;
}
}
(processes + shortest_Index)->runtime--;
IncrementTime(processes, n);
if(!(processes + shortest_Index)->runtime)
{
CompleteProcess(processes + shortest_Index);
}
total_time++;
fprintf(f,"Current time is: %d\n", total_time);
int d = 0;
for(d = 0; d < n; ++d)
{
fprintf(f,"Process id: %d ,", (processes + d)->id);
if(d == shortest_Index)
fprintf(f,"Process state: running\n");
else
{
if((processes + d)->isCompleted)
fprintf(f,"Process state: COMPLETED\n");
else
fprintf(f,"Process state: waiting\n");
}
}
}
fprintf(f,"Summary:\n");
int g = 0;
for(g = 0; g < n; ++g)
{
fprintf(f,"Process id: %d , Value: %f\n",(processes + g)->id, (double)(processes + g)>runtime_Copy/(double)(processes + g)->time);
}
fclose(f);
getchar();
system("data.txt");
system("cls");
free(processes);
}
int main()
{
int exit = NOT_COMPLETED;
printf("Application emulates 'Shortest job next' discipline . .\n");
while(!exit)
{
printf("Make a choice:\n");
printf("m - manual mode\na - auto mode\ne - exit\n");
char choice[SIZE];
gets(choice);
switch(*choice)
{
case 'm':
ManualMode();
break;
case 'a':
AutoMode();
break;
case 'e':
exit = COMPLETED;
break;
}
}
printf("Application will now exit . .\n");
getchar();
return 0;
}
Результаты работы и выводы.
Ручной режим: см текстовый файл отчета.
Автоматический режим:
Выполнен 1 Млн.процессов за суммарное время 824782585.
Среднее значение отношения времени выполнения к времени нахождения в системе по
всем процессам: 0.029702.
Список использованных источников.
 Методические указания для выполнения лабораторной работы.
 «Операционные системы» А.В.Гордеев,2 издание,Питер.2005
 «Язык программирования С », Б. Керниган, Д. Ритчи, второе издание 2012 .
 «Язык Си с примерами », Сэмюэл П. Харбисон, Гай Л. Стил, М. Бином, 2011 .
Download