码迷,mamicode.com
首页 > 其他好文 > 详细

操作系统(实验二、作业调度模拟程序实验)

时间:2016-04-22 01:03:24      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

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

专业 商业软件工程   姓名 丘惠敏 学号 201406114203

一、        实验目的

 

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

 

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

 

二、        实验内容和要求

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

 

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

 

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

 

1.      源程序名:压缩包文件(rarzip)中源程序名 job3.c

可执行程序名:job3.exe

2.      原理分析及流程图

主要通过数组和结构体存储各个作业信息,再用排序实现各个调度算法。

 1 struct jcb{
 2     int id;
 3     char status;
 4 
 5     int arrtime;
 6     int reqtime;
 7     int startime;
 8     int finitime;
 9 
10     float TAtime,TAWtime;
11     float prio;
12 }   jobarr[24],jobfin[24],job[24];

 

3.      主要程序段及其解释:

 

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<time.h>
  4 struct jcb{
  5     int id;
  6     char status;
  7 
  8     int arrtime;
  9     int reqtime;
 10     int startime;
 11     int finitime;
 12 
 13     float TAtime,TAWtime;
 14     float prio;
 15 }   jobarr[24],jobfin[24],job[24];
 16 int systime=0;
 17 //主菜单
 18 void menu()
 19 {
 20     printf("***************************************\n");
 21     printf("      1.调用文本写入数据\n");
 22     printf("      2.调用伪随机数的产生数据\n");
 23     printf("      3.调用自己输入模拟数据\n");
 24     printf("***************************************\n");
 25 }
 26 //调度算法菜单
 27 void menu0()
 28 {
 29     printf("\n***************************************\n");
 30     printf("      1.FCFS算法调度\n");
 31     printf("      2.SJF算法调度\n");
 32     printf("      3.HRRF算法调度\n");
 33     printf("      4.调用系统清屏\n");
 34     printf("      0.退出算法调度\n");
 35     printf("***************************************\n");
 36 }
 37 //短作业优先排序
 38 void sort(int n)
 39 {
 40     int i,j; 
 41     struct jcb temp;
 42     for(i=2;i<n;i++) 
 43     for(j=i+1;j<=n;j++) 
 44     if(jobarr[i].reqtime>jobarr[j].reqtime) //根据最短的要求服务时间排序
 45     { 
 46        temp=jobarr[i]; 
 47        jobarr[i]=jobarr[j]; 
 48        jobarr[j]=temp; 
 49     } 
 50 }
 51 //先到先服务排序
 52 void sort0(int n)
 53 {
 54     int i,j; 
 55     struct jcb temp;
 56     for(i=2;i<n;i++) 
 57     for(j=i+1;j<=n;j++) 
 58     if(job[i].arrtime>job[j].arrtime) //根据到达时间排序
 59     { 
 60        temp=job[i]; 
 61        job[i]=job[j]; 
 62        job[j]=temp; 
 63     } 
 64 }
 65 //自己输入模拟数据
 66 void shoushu()
 67 {
 68         int n;
 69     printf("作业个数:");
 70     scanf("%d",&n);
 71     for(int i=1;i<=n;i++)
 72     {
 73         printf("\n第%d个作业:",i+1);
 74         printf("\n输入id:");
 75         scanf("%d",&job[i].id);
 76         printf("到达时间:");
 77         scanf("%d",&job[i].arrtime);
 78         printf("要求服务时间:");
 79         scanf("%d",&job[i].reqtime);
 80         jobarr[i]=job[i];
 81     }
 82 }
 83 //文本写入数据
 84 int ReadFile()
 85 {
 86     int m=0;
 87     int i=1;
 88     FILE *fp;     //定义文件指针
 89     fp=fopen("4.txt","r");  //打开文件
 90     if(fp==NULL)
 91     {
 92         printf("File open error !\n");
 93         exit(0);
 94     }
 95     printf("\n id    作业到达时间     作业运行所需要时间\n");
 96     while(!feof(fp))
 97     {
 98         fscanf(fp,"%d%d%d",&job[i].id,&job[i].arrtime,&job[i].reqtime);  //fscanf()函数将数据读入
 99         printf("\n%3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime);  //输出到屏幕
100         i++;
101     };
102 
103     if(fclose(fp))     //关闭文件
104     {
105         printf("Can not close the file !\n");
106         exit(0);
107     }
108     m=i-1;
109     return m;
110 
111 }
112 //伪随机数的产生数据
113 int Pseudo_random_number()
114 {
115     int i,n;
116     srand((unsigned)time(0));  //参数seed是rand()的种子,用来初始化rand()的起始值。
117     //输入作业数
118     n=rand()%23+5;
119     for(i=1; i<=n; i++)
120     {
121         job[i].id=i;
122         //作业到达时间
123         job[i].arrtime=rand()%29+1;
124         //作业运行时间
125         job[i].reqtime=rand()%7+1;
126     }
127     printf("\n id    作业到达时间     作业运行所需要时间\n");
128     for(i=1; i<=n; i++)
129     {
130         printf("\n%3d%12d%15d",job[i].id,job[i].arrtime,job[i].reqtime);
131     }
132     return n;
133 
134 }
135 //先来先服务算法FCFS
136 void FCFS()
137 {
138     int i=1,j=1;
139     float sumTA=0,sumTAW=0;
140     printf("-----------先来先服务算法FCFS-------------\n");
141     printf("\n id    作业到达时间     作业运行所需要时间\n");
142     while(job[j].id!=NULL)
143     {
144         printf("\n%3d%12d%15d",job[j].id,job[j].arrtime,job[j].reqtime);  //输出到屏幕
145         j++;
146     }
147     sort0(j-1);
148         printf("\n\n id    作业到达时间   作业完成时间   运行时间  作业周转时间  带权作业周转时间\n");
149         while(job[i].id!=NULL)
150     {
151         if(i==1)  //第一个作业先到达,先被调度
152         {
153             job[i].startime=job[i].arrtime;
154         }
155         else   //其他作业被调度
156         {
157             if(job[i-1].finitime>=job[i].arrtime)  //如果上一个作业的完成时间大于下一个到达时间,则下一个开始时间为上一个作业的完成时间
158                 job[i].startime=job[i-1].finitime;
159             else
160                 job[i].startime=job[i].arrtime;   //否则下一个开始时间即它的到达时间
161         }
162         job[i].finitime=job[i].startime+job[i].reqtime; //计算完成时间
163         job[i].TAtime=job[i].finitime-job[i].arrtime; //计算周转时间
164         job[i].TAWtime=job[i].TAtime/job[i].reqtime;   //计算带权周转时间
165         sumTA+=job[i].TAtime;
166         sumTAW+=job[i].TAWtime;
167         printf("\n%3d%12d%13d%14d%12.0lf%14.2lf",job[i].id,job[i].arrtime,job[i].finitime,job[i].reqtime,job[i].TAtime,job[i].TAWtime); 
168         i++;
169     }
170         printf("\n平均作业周转时间= %.2lf",sumTA/(i-1));
171         printf("\n平均带权作业周转时间= %.2lf",sumTAW/(i-1));
172 }
173 //最短作业优先算法SJF
174 void SJF()
175 {
176     int i=1,j=1;
177     float sumTA=0,sumTAW=0;
178     printf("-----------最短作业优先算法SJF-------------\n");
179     printf("\n id    作业到达时间     作业运行所需要时间\n");
180     while(job[j].id!=NULL)
181     {
182         printf("\n%3d%12d%15d",job[j].id,job[j].arrtime,job[j].reqtime);  //输出到屏幕
183         jobarr[j]=job[j];
184         j++;
185     }
186     sort(j-1);
187     printf("\n\n id    作业到达时间   作业完成时间   运行时间  作业周转时间  带权作业周转时间\n");
188     while(jobarr[i].id!=NULL)
189     {
190         if(i==1)
191         {
192             jobarr[i].startime=jobarr[i].arrtime;
193         }
194         else
195         {
196             if(jobarr[i-1].finitime>=jobarr[i].arrtime)
197                 jobarr[i].startime=jobarr[i-1].finitime;
198             else
199                 jobarr[i].startime=jobarr[i].arrtime;
200         }
201         jobarr[i].finitime=jobarr[i].startime+jobarr[i].reqtime;
202         jobarr[i].TAtime=jobarr[i].finitime-jobarr[i].arrtime;
203         jobarr[i].TAWtime=jobarr[i].TAtime/jobarr[i].reqtime;
204         sumTA+=jobarr[i].TAtime;
205         sumTAW+=jobarr[i].TAWtime;
206         printf("\n%3d%12d%13d%14d%12.0lf%14.2lf",jobarr[i].id,jobarr[i].arrtime,jobarr[i].finitime,jobarr[i].reqtime,jobarr[i].TAtime,jobarr[i].TAWtime); 
207         i++;
208     }
209         printf("\n平均作业周转时间= %.2lf",sumTA/(i-1));
210         printf("\n平均带权作业周转时间= %.2lf",sumTAW/(i-1));
211 }
212 //最高响应比排序
213 void sort1(int n,int k)
214 {
215     int i,j; 
216     struct jcb temp;
217     for(i=k;i<n;i++) 
218     for(j=i+1;j<=n;j++) 
219     if(jobfin[i].prio<jobfin[j].prio) 
220     { 
221        temp=jobfin[i]; 
222        jobfin[i]=jobfin[j]; 
223        jobfin[j]=temp; 
224     } 
225 }
226 //响应比最高者优先HRRF算法
227 void HRRF()
228 {
229     int i=1,j=1,k=1;
230     float sumTA=0,sumTAW=0;
231     printf("-----------响应比最高者优先HRRF算法-------------\n");
232     printf("\n id    作业到达时间     作业运行所需要时间\n");
233     while(job[j].id!=NULL)
234     {
235         printf("%3d%12d%15d\n",job[j].id,job[j].arrtime,job[j].reqtime);  //输出到屏幕
236         jobfin[j]=job[j];
237         j++;
238     }
239     while(jobfin[k].id!=NULL)
240     {
241         i=k;  
242         if(k==1)
243         {
244             jobfin[i].startime=jobfin[i].arrtime;
245             jobfin[i].finitime=jobfin[i].startime+jobfin[i].reqtime;
246             jobfin[i].TAtime=jobfin[i].finitime-jobfin[i].arrtime;
247             jobfin[i].TAWtime=jobfin[i].TAtime/jobfin[i].reqtime;
248         }
249         else
250         {
251         printf("\nid   最高响应比\n");
252         while(jobfin[i].id!=NULL)
253         {
254             if(jobfin[k-1].finitime>=job[i].arrtime)
255             {
256                 jobfin[i].startime=jobfin[k-1].finitime;
257                 jobfin[i].prio=(jobfin[i].startime-jobfin[i].arrtime)/(jobfin[i].reqtime/1.0)+1;
258             }
259             else
260             {
261                 jobfin[i].startime=0;    
262                   jobfin[i].prio=0;
263             }
264             i++;
265         }
266         sort1(j-1,k);
267         for(i=k;i<j;i++)
268             printf("%3d%10.2lf\n",jobfin[i].id,jobfin[i].prio);
269         jobfin[k].finitime=jobfin[k-1].finitime+jobfin[k].reqtime;
270         jobfin[k].TAtime=jobfin[k].finitime-jobfin[k].arrtime;
271         jobfin[k].TAWtime=jobfin[k].TAtime/jobfin[k].reqtime;
272         }
273         k++;
274     }
275         printf("\n\n id    作业到达时间   作业完成时间   运行时间  作业周转时间  带权作业周转时间\n");
276         for(i=1;i<j;i++)
277         {
278             printf("\n%3d%12d%13d%14d%12.0lf%14.2lf",jobfin[i].id,jobfin[i].arrtime,jobfin[i].finitime,jobfin[i].reqtime,jobfin[i].TAtime,jobfin[i].TAWtime); 
279             sumTA+=jobfin[i].TAtime;
280             sumTAW+=jobfin[i].TAWtime;
281         }
282         printf("\n平均作业周转时间= %.2lf",sumTA/(i-1));
283         printf("\n平均带权作业周转时间= %.2lf",sumTAW/(i-1));
284 }
285 void main0()
286 {
287     int tmp;
288     while(1)
289     {
290     menu0();
291     printf("\n请选择菜单项:");
292     scanf("%d",&tmp);
293     switch (tmp)
294     {
295     case 1:
296         FCFS();
297         break;
298     case 2:
299         SJF();
300         break;
301     case 3:
302         HRRF();
303         break;
304     case 4:
305         system("cls");
306         break;
307     case 0:
308         return;
309     }
310     }
311 }
312 main()
313 {
314     int tmp;
315     while(1)
316     {
317     menu();
318     printf("\n请选择菜单项:");
319     scanf("%d",&tmp);
320     switch (tmp)
321     {
322     case 1:
323         ReadFile();
324         break;
325     case 2:
326         Pseudo_random_number();
327         break;
328     case 3:    
329         shoushu();
330         break;
331     }
332     main0();
333     printf("\n");
334     }
335 }

 

4.      运行结果及分析

文本写入数据                                                                                  伪随机数的产生数据

技术分享技术分享

自己输入模拟数据

技术分享

FCFS算法调度                                                                                                                           

技术分享

SJF算法调度

技术分享

 HRRF算法调度

 技术分享

 

四、        实验总结

 一开始看到老师展示这个实验时,我觉得这是一个很难的实验,即使给我一周也做不完。但是跟着老师的步骤一步一步来,我在一周内把这个实验基本完成了。有时候看起来不可能的任务,被拆解成多部分,在一步一步来完成,我们也能达到我们的目标。

操作系统(实验二、作业调度模拟程序实验)

标签:

原文地址:http://www.cnblogs.com/qiuhuimin/p/5419603.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!