ГУАП КАФЕДРА № 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 .