【操作系统】 作业调度模拟程序 实验二

实验一、作业调度模拟程序实验

商业软件工程 201406114116 黄敏鹏

一、        实验目的

(1)加深对作业调度算法的理解;

(2)进行程序设计的训练。

二、        实验内容和要求

实验内容

根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。

实验要求

用高级语言编写一个或多个作业调度的模拟程序。

单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。

一、       模拟数据的生成

1.            允许用户指定作业的个数(2-24),默认值为5。

2.            允许用户选择输入每个作业的到达时间和所需运行时间。

3.            (**)从文件中读入以上数据。

4.            (**)也允许用户选择通过伪随机数指定每个作业的到达时间(0-30)和所需运行时间(1-8)。

二、       模拟程序的功能

1.            按照模拟数据的到达时间和所需运行时间,执行FCFS, SJF和HRRN调度算法,程序计算各作业的开始执行时间,各作业的完成时间,周转时间和带权周转时间(周转系数)。

2.            动态演示每调度一次,更新现在系统时刻,处于运行状态和等待各作业的相应信息(作业名、到达时间、所需的运行时间等)对于HRRN算法,能在每次调度时显示各作业的响应比R情况。

3.            (**)允许用户在模拟过程中提交新作业。

4.            (**)编写并调度一个多道程序系统的作业调度模拟程序。 只要求作业调度算法:采用基于先来先服务的调度算法。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。

三、       模拟数据结果分析

1.            对同一个模拟数据各算法的平均周转时间,周转系数比较。

2.            (**)用曲线图或柱形图表示出以上数据,分析算法的优点和缺点。

四、       实验准备

序号

准备内容

完成情况

1

什么是作业?

作业相当于一个程序。 任务相当于整个程序中的一段段可以并发执行的代码。 进程其实就是任务。从系统的角度看,作业则是一个比程序更广的概念。它由程序、数据和作业说明书组成。系统通过作业说明书控制文件形式的程序和数据,使之执行和操作。而且,在批处理系统中,作业是抢占内存的基本单位。也就是说,批处理系统以作业为单位把程序和数据调入内存以便执行。

2

一个作业具备什么信息?

作业由三部分组成,即程序、数据和作业说明书。一个作业可以包含多个程序和多个数据集,但必须至少包含一个程序。否则将不成为作业。

3

为了方便模拟调度过程,作业使用什么方式的数据结构存放和表示?

由作业说明书在系统中生成一个称为作业控制块(job control block,JCB)的表格。该表格登记该作业所要求的资源情况、预计执行时间和执行优先级等。从而,操作系统通过该表了解到作业要求,并分配资源和控制作业中程序和数据的编译、链接、装入和执行等。

4

操作系统中,常用的作业调度算法有哪些?

先来先服务算法、最短作业优先算法、最短剩余时间优先算法、最高响应比优先算法、轮转调度算法、多级反馈队列调度算法、优先级法调度算法  

5

如何编程实现作业调度算法?

6

模拟程序的输入如何设计更方便、结果输出如何呈现更好?

 

五、       其他要求

1.            完成报告书,内容完整,规格规范。

2.            实验须检查,回答实验相关问题。

注:带**号的条目表示选做内容。

三、        实验方法、步骤及结果测试

1.      原理分析及流程图

作业调度算法:

1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。

2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。

3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间

每个作业由一个作业控制块JCB表示,JCB可以包含以下信息:作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。

作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种之一。每个作业的最初状态都是等待W。

程序运行截图:

输入数据:

功能选择页面:

最高响应比排序:

先到先服务排序:

短作业优先排序:

源代码如下:

  1 #include<windows.h>
  2 #include<dos.h>
  3 #include<time.h>
  4 #include<stdlib.h>
  5 #include<stdio.h>
  6 #include<conio.h>
  7 #include<string.h> 
  8 
  9 struct jcb {
 10     char name[10];    /*作业号*/
 11     int arrtime;      /* 作业到达时间*/
 12     int reqtime;      /*作业要求服务时间*/
 13     int waiTime;      /*等待时间*/
 14     int startime;     /*开始运行时间*/
 15     int finitime;     /*结束运行时间*/
 16     int TAtime;       /*周转时间*/
 17     int TTAWtime;     /*带权周转时间*/
 18     int priority;     /*优先权*/
 19     int finish;       /*是否已经完成*/
 20 }jobarr[24],jobfin[24],job[24];
 21 
 22 int systime=0;    //系统时间
 23 int intarr=0;     //记录jobarr[]的元素个数
 24 int intfin;       //记录jobfin[]的元素个数
 25 int intjob;       //记录job[]的元素个数
 26 
 27 void intputjobarr();
 28 void putoutAlljobarr();
 29 void sort();
 30 void simulateCohort();
 31 int HRN(int pre);
 32 void runing(int i, int times, int pre, int staTime, int endTime);
 33 void print(int i,int times);
 34 void check( );
 35 void SortByreqtime(int,jcb*);
 36 void SJF(int);
 37 int FindTheShortarrtimejobarray(int, int);
 38 int DeleteTheUsedJobById(jcb, int);
 39 void SortByarrtime(int, jcb*);
 40 
 41 /*
 42     主函数
 43 */
 44 void main()
 45 {
 46     system("mode con cols=100 lines=30");  //窗口宽度高度
 47     system("title -huangMP-116");           //设置窗口标题
 48     int n;
 49     int choose;
 50     printf("
	作业的个数 : ");
 51     scanf("%d",&n);
 52     while(intarr<n){
 53         intputjobarr();
 54     }    
 55     do{
 56         system("cls");
 57         printf("
	0.最高响应比    1.先到先服务    2.短作业优先    3.结束程序

	");
 58         printf("请选择服务:");
 59         scanf("%d",&choose);
 60         switch(choose){
 61         case 0:
 62             check();
 63             putoutAlljobarr();
 64             break;
 65         case 1:
 66             simulateCohort();
 67             putoutAlljobarr();
 68             break;
 69         case 2:
 70             SJF(intarr);
 71             putoutAlljobarr();
 72             break;
 73         case 3:
 74             exit(0);
 75             break;
 76         }
 77     }while(1);
 78 }
 79 
 80 /*--------------------------------------------------------------------------------------
 81     先到先服务 开始
 82     优先权 = 到达时间
 83 */
 84 void sort(){
 85     jcb k;
 86     for(int i=0;i<intarr;i++){
 87         for(int j=0;j<intarr-1;j++){
 88             if(jobarr[j].arrtime>jobarr[j+1].arrtime){
 89                 k=jobarr[j];
 90                 jobarr[j]=jobarr[j+1];
 91                 jobarr[j+1]=k;
 92             }
 93         }
 94     }
 95 }
 96 void simulateCohort(){
 97         jobarr[0].startime=jobarr[0].arrtime;
 98         jobarr[0].finitime=jobarr[0].startime+jobarr[0].reqtime;
 99         jobarr[0].TAtime=jobarr[0].finitime-jobarr[0].arrtime;
100         jobarr[0].TTAWtime=float(jobarr[0].TAtime)/jobarr[0].reqtime;
101     for(int i=1;i<intarr;i++){
102         if(jobarr[i].arrtime<jobarr[i-1].finitime)
103             jobarr[i].startime=jobarr[i-1].finitime;
104         else
105             jobarr[i].startime=jobarr[i].arrtime;
106         jobarr[i].finitime=jobarr[i].startime+jobarr[i].reqtime;
107         jobarr[i].TAtime=jobarr[i].finitime-jobarr[i].arrtime;
108         jobarr[i].TTAWtime=float(jobarr[i].TAtime)/jobarr[i].reqtime;
109     }
110 }
111 float sjp(int n){
112     int i,first=0,count,flag[20],k,min;
113     float time=0,weight_time=0;
114     //调度第一个到达内存的进程
115     for(i=1;i<n;i++)
116     {
117         if(jobarr[first].arrtime>jobarr[i].arrtime) 
118             first=i;
119         flag[i]=0;
120     }
121     flag[first]=1;
122     time=(float)jobarr[first].reqtime;
123     weight_time=1;
124     printf("%s   %d    %d    %d
",jobarr[first].name,jobarr[first].arrtime,jobarr[first].reqtime,weight_time);
125     //jobarr_temp[0]=jobarr[first];
126     count=n-1;
127     while(count)
128     {
129         k=0;
130         min=32767; //设置一个较大的阈值,
131         for(i=0;i<n;i++) //找到一个未被访问的,作业较短的且已经到达内存的作业调度 
132             if((i!=first)&&(flag[i]==0)&&(time>=jobarr[i].arrtime)&&(min>jobarr[i].reqtime))
133             {
134                 k=i;
135                 min=jobarr[i].reqtime;
136                 
137             }
138             flag[k]=1; //访问后置标记为访问
139             time+=jobarr[k].reqtime;
140             weight_time+=(time-jobarr[k].arrtime)/jobarr[k].reqtime;
141             
142             printf("%s   %d    %d    %d
",jobarr[k].name,jobarr[k].arrtime,jobarr[k].reqtime,(time-jobarr[k].arrtime)/jobarr[k].reqtime);
143             count--; //每调度一个作业,count减1
144     }
145     return weight_time/=n;
146 }
147 /*
148     先到先服务 结束
149 */
150 
151 /*--------------------------------------------------------------------------------------
152     最高响应比  开始
153     优先权 =(等待时间+服务时间)/服务时间
154 */
155 int HRN(int pre) {
156     int current=1,i,j;
157     for(i=0; i<intarr; i++)  {
158         jobarr[i].waiTime=jobarr[pre].finitime-jobarr[i].arrtime; /*等待时间 =上一个业的完成时间-到达时间*/
159         jobarr[i].priority=(jobarr[i].waiTime+jobarr[i].reqtime)/jobarr[i].reqtime;
160     }
161     for(i=0; i<intarr; i++)
162     {
163         if(!jobarr[i].finish)
164         {
165             current=i;  /*找到第一个还没完成的作业*/
166             break;
167         }
168     } 
169     for( j=i; j<intarr; j++) /*和后面的作业比较*/
170     {
171         if( !jobarr[j].finish) /* 还没完成(运行)*/
172         {
173             if(jobarr[current].arrtime<=jobarr[pre].finitime)  /*如果作业在上一个作业完成之前到达*/
174             {
175                 if(jobarr[j].arrtime<=jobarr[pre].finitime && jobarr[j].priority>jobarr[current].priority )
176                     current=j;/* 找出到达时间在上一个作业完成之前,优先权高的作业*/
177             }
178             else /* 如果作业是在上一个作业完成之后到达*/
179             {
180                 if(jobarr[j].arrtime<jobarr[current].arrtime)
181                         current=j;  /* 找出比较早到达的一个*/
182                 if(jobarr[j].arrtime==jobarr[current].arrtime) /* 如果同时到达*/
183                     if(jobarr[j].priority>jobarr[current].priority)
184                         current=j; /*找出服务时间比较短的一个*/
185             }
186         }
187     }
188     return current;/*返回当前作业*/
189 }
190 void runing(int i, int times, int pre, int staTime, int endTime) {
191     if(times==0)
192     {
193         jobarr[i].startime=jobarr[i].arrtime;
194         jobarr[i].finitime=jobarr[i].startime+jobarr[i].reqtime;
195         jobarr[i].TAtime=jobarr[i].reqtime;
196         jobarr[i].TTAWtime=1.0;
197         staTime=jobarr[i].startime;
198     }else{
199         if(jobarr[i].arrtime>jobarr[pre].finitime)
200             jobarr[i].startime=jobarr[i].arrtime;
201         else
202             jobarr[i].startime=jobarr[pre].finitime;
203         jobarr[i].finitime=jobarr[i].startime+jobarr[i].reqtime;
204         jobarr[i].TAtime=jobarr[i].finitime-jobarr[i].arrtime;
205         jobarr[i].TTAWtime=float(jobarr[i].TAtime)/jobarr[i].reqtime;
206     }
207     if(times==intarr-1)
208         endTime=jobarr[i].finitime;
209     jobarr[i].finish=1;
210 }
211 void check( ) {
212     int i;
213     int staTime, endTime;
214     int current=0, times=0, pre=0;   jobarr[pre].finitime=0;
215     jobarr[pre].finitime=0;
216     for(i=0; i<intarr; i++)
217     {
218         jobarr[i].finish=0;
219     } 
220     for(times=0; times<intarr; times++)
221     {
222         current=HRN(pre);
223         runing(current, times, pre, staTime, endTime);
224         pre=current;
225     }
226 }  
227 /*
228     最高响应比优先  结束
229   */
230 
231 /*--------------------------------------------------------------------------------------
232     短作业优先  开始
233     优先权 = 最短服务时间
234   */
235 void SJF(int n) {
236     int i = 0;
237     int arrfinish = 0;
238     int finArrCount = 0;
239     arrfinish = jobarr[i].arrtime + jobarr[i].reqtime;
240     jobarr[i].finitime = arrfinish;
241     jobarr[i].TAtime = arrfinish - jobarr[i].arrtime;
242     jobarr[i].TTAWtime = jobarr[i].TAtime/jobarr[i].reqtime;
243     n = DeleteTheUsedJobById(jobarr[i], n);
244     while(n) {
245         //得到jobfin数组元素个数
246         finArrCount = FindTheShortarrtimejobarray(n, arrfinish);
247         if(finArrCount == 0) {
248             SortByarrtime(n, jobarr);
249             if(arrfinish <= jobarr[i].arrtime)
250                 arrfinish = jobarr[i].arrtime + jobarr[i].reqtime;
251             else
252                 arrfinish = arrfinish + jobarr[i].reqtime;
253             jobarr[i].finitime = arrfinish;
254             jobarr[i].TAtime = arrfinish - jobarr[i].arrtime;
255             jobarr[i].TTAWtime = jobarr[i].TAtime/jobarr[i].reqtime;
256             n = DeleteTheUsedJobById(jobarr[i], n);
257             continue;
258         }
259         while(finArrCount) {
260             arrfinish = arrfinish + jobfin[i].reqtime;
261             jobfin[i].finitime = arrfinish;
262             jobfin[i].TAtime = arrfinish - jobfin[i].arrtime;
263             jobfin[i].TTAWtime = jobfin[i].TAtime/jobfin[i].reqtime;
264             for(int j=0; j < n; j++) {
265                 if(strcmp(jobfin[i].name,jobarr[j].name) == 0) {
266                     jobarr[j] = jobfin[i];
267                 }
268             }
269             n = DeleteTheUsedJobById(jobfin[i], n);
270             i++;
271             finArrCount--;
272         }
273         i=0;
274     }
275 }
276 //组织服务时间最短的作业数组
277 int FindTheShortarrtimejobarray(int n, int arrfinish) {
278     jcb temp;
279     int finArrCount = 0;
280     temp = jobarr[0];
281     for(int i=0; i < n; i++) {
282         if(jobarr[i].arrtime <= arrfinish) {
283             jobfin[finArrCount] = jobarr[i];
284             finArrCount++;
285         }
286     }
287     SortByreqtime(finArrCount, jobfin);
288     return finArrCount;
289 }
290 //通过服务时间排序
291 void SortByreqtime(int n, jcb temp1[24]) {
292     int i, j;
293     jcb temp;
294     for (j = 0; j < n - 1; j++) {
295         for (i = 0; i < n - 1 - j; i++)
296         {
297             if(temp1[i].reqtime > temp1[i + 1].reqtime)
298             {
299                 temp = temp1[i];
300                 temp1[i] = temp1[i+1];
301                 temp1[i+1] = temp;
302             }
303         }
304     }
305 }
306 //通过id删除
307 int DeleteTheUsedJobById(jcb idJob, int n) {
308     jcb temp;
309     for(int i=0; i < n; i++) {
310         if(strcmp(idJob.name,jobarr[i].name) == 0)
311             break;
312     }
313     for( ; i < n - 1; i++) {
314         temp = jobarr[i];
315         jobarr[i] = jobarr[i+1];
316         jobarr[i+1] = temp;
317     }
318     return n-1; 
319 }
320 void SortByarrtime(int n, jcb temp[24]) {
321     int i, j;
322     jcb temp1;
323     for (j = 0; j < n - 1; j++) {
324         for (i = 0; i < n - 1 - j; i++)
325         {
326             if(temp[i].arrtime > temp[i + 1].arrtime)
327             {
328                 temp1 = temp[i];
329                 temp[i] = temp[i+1];
330                 temp[i+1] = temp1;
331             }
332         }
333     }
334 }
335 /*
336     短作业优先  结束
337   */
338 
339 /*
340     向jobarr输入一个作业
341 */
342 void intputjobarr(){
343     printf("
第 %d 个作业:
",intarr+1);
344     printf("	输入作业名:");
345     scanf("%s",&jobarr[intarr].name);
346     printf("	到达时间:");
347     scanf("%d",&jobarr[intarr].arrtime);
348     printf("	要求服务时间:");
349     scanf("%d",&jobarr[intarr].reqtime);
350     intarr++;
351 }
352 /*
353     输出所有作业信息    
354 */
355 void putoutAlljobarr(){
356     system("cls");    
357     printf("
----------------------------------------------------------------------------

");
358     printf("    作业名    到达时间    要求服务时间    调度时间    完成时间    周转时间    带权周转时间
");
359     for(int i=0;i<intarr;i++){
360         printf("    %6s    %8d    %12d    %8d    %8d    %8d    %8d
",jobarr[i].name,jobarr[i].arrtime,jobarr[i].reqtime,jobarr[i].startime,jobarr[i].finitime,jobarr[i].TAtime,jobarr[i].TTAWtime);
361     }    
362     int sumTAtime=0.0, sumTTAWtime=0.0, aveTAtime, aveTTAWtime;
363     for(i=0; i<intarr; i++)
364     {
365         sumTAtime+=jobarr[i].TAtime;
366         sumTTAWtime+=jobarr[i].TTAWtime;
367     }
368     aveTAtime=sumTAtime/intarr;  aveTTAWtime=sumTTAWtime/intarr;
369     printf("
( 服务时间和 : 平均带权周转时间 : 平均带权周转时间 )    %5d%5d%5d
",sumTAtime,aveTAtime,aveTTAWtime);     
370     printf("
----------------------------------------------------------------------------


");
371     
372     system("pause");
373 }
原文地址:https://www.cnblogs.com/huangmp1024/p/5426947.html