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

实验二 作业调度模拟程序

时间:2016-04-21 21:50:57      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

 实验二  作业调度模拟程序

一、目的和要求

1. 实验目的

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

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

2.实验要求

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

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

     作业调度算法:

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

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

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

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

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

 

一、       模拟数据的生成

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

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

单个作业使用结构体,多个作业使用队列。

4

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

先来先服务(FCFS)算法,最短作业优先 (SJF)算法,最短剩余时间优先算法,最高响应比优先(HRRN)算法,轮转法,多级反馈队列算法。

5

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

分析各种调度算法,理解算法过程,利用先来先服务(FCFS)算法,最短作业优先 (SJF)算法编程实现

6

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

输入:读取文件的方式

输出:以二维表关系的形式输出

 

五、       其他要求

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

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

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

二、实验内容

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

、实验环境

可以采用TC,也可以选用Windows下的利用各种控件较为方便的VB,VC等可视化环境。也可以自主选择其他实验环境。

四、实验原理及核心算法参考程序段      

      单道FCFS算法:

        技术分享

 

 

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

 

 

运行结果:

技术分享

技术分享

技术分享

技术分享

技术分享

 

实验总结:通过这次实验,加深了自己对作业调度算法的理解,加强了对程序设计的训练,仍然有部分问题没解决,就像产生随机数,周转时间是负数的BUG没解决还有选择调度算法后就直接结束了,并没有进行循环。程序设计方面还要有待加强。

实验二 作业调度模拟程序

标签:

原文地址:http://www.cnblogs.com/sol6/p/5402507.html

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