实验二 作业调度模拟程序

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

专业:商业软件工程   姓名:王大华  学号:201406114221

一、实验目的

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

     (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

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

 

5

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

 

6

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

 

 

五、其他要求

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

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

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

六、主要程序

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 #define MAX 200
  5 typedef struct
  6 {
  7     char name[10];//作业名称
  8     int arrtime;//到达时间
  9     int reqtime;//要求服务时间
 10     int startime;//开始时间
 11     int finitime;//完成时间
 12     int waittime;//等待时间
 13     float TAtime,TAWtime;//周转时间,带权周转时间
 14     float prio;
 15 }job;
 16 
 17 job a[MAX];
 18 
 19 void FCFS(int num);
 20 void SJF(int num);
 21 void HRRF(int num);
 22 
 23 
 24 
 25 void main()     //主函数
 26 {
 27     int num;
 28     int i,j;
 29     printf("\n请输入作业个数:");
 30     scanf("%d",&num);
 31     printf("\n");
 32     for(i=0;i<num;i++)
 33     {
 34         printf("第%d个作业:\n",i+1);
 35         printf("输入作业名称:");
 36         scanf("%s",a[i].name);
 37         printf("到达时间:");
 38         scanf("%d",&a[i].arrtime);
 39         printf("要求服务时间:");
 40         scanf("%d",&a[i].reqtime);
 41         printf("\n");
 42     }
 43     for(j=0;j<num;j++)
 44     {
 45         for(i=0;i<num-j;i++)
 46         {
 47             if(a[i].arrtime>a[i+1].arrtime)
 48             {
 49                 a[num]=a[i];
 50                 a[i]=a[i+1];
 51                 a[i+1]=a[num];
 52             }
 53         }
 54     }
 55     printf("\t\t作业名称\t到达时间\t要求服务时间\n");
 56     for(i=0;i<num;i++)
 57     {
 58         printf("N%d\t\t%s\t\t%d\t\t%d\n",i+1,a[i].name,a[i].arrtime,a[i].reqtime);
 59     }
 60     while(1)
 61     {
 62         printf("请选择算法\n:");
 63         printf("1.FCFS算法\n");
 64         printf("2.SJF算法\n");
 65         printf("3.HRRF算法\n");
 66         printf("0.退出\n");
 67         printf("请选择(0-3):");
 68         
 69         scanf("%d",&i);
 70         if(i==1)
 71         {
 72             printf("\t\t1.FCFS算法\n");
 73             FCFS(num);
 74         }
 75         if(i==2)
 76         {
 77             printf("\t\t2.SJF算法\n");
 78             SJF(num);
 79         }
 80         if(i==3)
 81         {
 82             printf("\t\t3.HRRF算法\n");
 83             HRRF(num);
 84         }
 85         if(i==0)
 86         {
 87             exit(0);
 88         }
 89     }
 90 
 91 }
 92 
 93 
 94 void FCFS(int num)  //建立一个先到先服务算法
 95 {
 96     int i;
 97     float sum_TAtime=0;//作业总周转时间
 98     float sum_TAWtime=0;//作业总带权周转时间
 99 
100     a[0].finitime = a[0].arrtime + a[0].reqtime;
101     a[0].startime = a[0].arrtime;
102     for(i = 1; i < num; i++)
103     {
104         a[i].startime = a[i-1].finitime;
105         a[i].finitime = a[i-1].finitime + a[i].reqtime;
106     }
107     for(i = 0; i < num; i++)
108     {
109         a[i].TAtime = a[i].finitime - a[i].arrtime;
110         sum_TAtime += a[i].TAtime;
111         a[i].TAWtime = a[i].TAtime / a[i].reqtime;
112         sum_TAWtime += a[i].TAWtime;
113     }
114 
115     printf("作业名\t到达时间\t要求服务时间\t开始时间\t结束时间\t周转时间\t带权周转时间\n");
116     for(i = 0; i < num; i++)
117     {
118         printf("%s\t\t%d\t\t%d\t\t%d\t\t%d\t\t%.2f\t%.2f\n", a[i].name, a[i].arrtime, a[i].reqtime, a[i].startime, a[i].finitime, a[i].TAtime, a[i].TAWtime);
119     }
120     printf("平均作业周转时间为:%.2lf\n",sum_TAtime*1.0/num);  
121     printf("平均带权作业周转时间为:%.2lf\n\n",sum_TAWtime*1.0/num);  
122 
123 }
124 
125 
126 void SJF(int num)  //建立最短作业优先函数
127 {
128     int i, j;
129     float sum_TAtime=0;
130     float sum_TAWtime=0;
131     
132     a[0].finitime = a[0].arrtime + a[0].reqtime;
133     a[0].startime = a[0].arrtime;
134     
135     for(i = 1; i < num; i++)
136     {
137         for(j = 1; j <  num-1; j++)
138         {
139             if(a[j].reqtime > a[j+1].reqtime)
140             {
141                 a[num] = a[j]; 
142                 a[j] = a[j+1]; 
143                 a[j+1] = a[num];
144             }
145         }
146     }
147     for(i = 1; i < num; i++)
148     {
149         a[i].startime = a[i-1].finitime;
150         a[i].finitime = a[i-1].finitime + a[i].reqtime;
151     }
152     for(i = 0; i < num; i++)
153     {
154         a[i].TAtime = a[i].finitime - a[i].arrtime;
155         sum_TAtime += a[i].TAtime;
156         a[i].TAWtime = a[i].TAtime / a[i].reqtime;
157         sum_TAWtime += a[i].TAWtime;
158     }
159 
160     printf("作业名\t到达时间\t要求服务时间\t开始时间\t结束时间\t周转时间\t带权周转时间\n");
161     for(i = 0; i < num; i++)
162     {
163         printf("%s\t%d\t%d\t%d\t%d\t%.2f\t%.2f\n", a[i].name, a[i].arrtime, a[i].reqtime, a[i].startime, a[i].finitime, a[i].TAtime, a[i].TAWtime);
164     }
165     printf("平均作业周转时间为:%.2lf\n",sum_TAtime*1.0/num);  
166     printf("平均带权作业周转时间为:%.2lf\n\n",sum_TAWtime*1.0/num);  
167 
168 
169 }
170 
171 
172 void HRRF(int num)  //建立一个最短作业优先函数
173 {
174      int i, j;
175     float sum_TAtime=0;
176     float sum_TAWtime=0;
177      
178     a[0].finitime = a[0].arrtime + a[0].reqtime;
179     a[0].startime = a[0].arrtime;
180    
181     for(i = 1; i <num; i++)
182     {
183         for(j = 1; j < num-1; j++)
184         {
185             if(a[j].prio < a[j+1].prio)
186             {
187                 if(a[j].arrtime == a[j+1].arrtime)
188                 {
189                     a[num] = a[j]; 
190                     a[j] = a[j+1]; 
191                     a[j+1] = a[num];
192                 }
193             }
194         }
195     }
196     for(i = 1; i <num; i++)
197     {
198         a[i].prio = 1 + (a[i-1].finitime - a[i].arrtime) / a[i].reqtime;
199         a[i].finitime = a[i-1].finitime + a[i].reqtime;
200     }
201 
202     for(i = 0; i <num; i++)
203     {
204         a[i].TAtime = a[i].finitime - a[i].arrtime;
205         sum_TAtime += a[i].TAtime;
206         a[i].TAWtime = a[i].TAtime / a[i].reqtime;
207         sum_TAWtime += a[i].TAWtime;
208     }
209 
210     printf("作业名\t到达时间\t要求服务时间\t开始时间\t结束时间\t周转时间\t带权周转时间\n");
211     for(i = 0; i < num; i++)
212     {
213         printf("%s\t%d\t%d\t%d\t%d\t%.2f\t%.2f\n", a[i].name, a[i].arrtime, a[i].reqtime, a[i].startime, a[i].finitime, a[i].TAtime, a[i].TAWtime);
214     }
215     printf("平均作业周转时间为:%.2lf\n",sum_TAtime*1.0/num);  
216     printf("平均带权作业周转时间为:%.2lf\n\n",sum_TAWtime*1.0/num);  
217 
218 }

 

七、运行结果

八、实验总结

这次实验涉及了c语言中很多内容,而自己还有很多不懂,所以做起来有点困难,不过通过这次实验,温习了c语言的一些知识,知道了自己的一些不足

posted @ 2016-04-22 13:46  21王大华  阅读(250)  评论(0编辑  收藏  举报