45马文其  

实验二作业调度模拟程序

一、目的和要求

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

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

 

5

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

 

6

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

 

 

五、       其他要求

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

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

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

二、实验内容

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

、实验环境

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

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

     单道FCFS算法:

        

  1 #include <stdio.h>
  2 #include <stdlib.h>  
  3 #include <conio.h>   
  4 #define getpch(type) (type*)malloc(sizeof(type))
  5 #define NULL 0
  6 int n;
  7 float T1=0,T2=0; 
  8 int times=0;  
  9 struct jcb      //作业控制块 
 10 {   
 11   char name[10];  //作业名 
 12   int reachtime;   //作业到达时间  
 13   int starttime;    //作业开始时间   
 14   int needtime;       //作业需要运行的时间  
 15   float super;       //作业的响应比  
 16   int finishtime;       //作业完成时间  
 17   float cycletime;       //作业周转时间   
 18   float cltime;           //作业带权周转时间  
 19   char state;            //作业状态  
 20   struct jcb *next;      //结构体指针 
 21 }*ready=NULL,*p,*q;  
 22 typedef struct jcb JCB; 
 23 void inize()       //初始化界面
 24 {
 25     printf("\n\n\t\t*********************************************\t\t\n"); 
 26     printf("\t\t\t\t单道批处理作业调度系统\n");  
 27     printf("\t\t*********************************************\t\t\n"); 
 28     printf("\n\n\n\t\t\t\t\t文其马\n"); 
 29     printf("\t\t\t\t\t\t作业调度程序\n\n");  
 30     printf("\n\n\n\t\t请按任意键进入主菜单:"); 
 31     getch();
 32 }
 33 void inital() //建立作业控制块队列,先将其排成先来先服务的模式队列
 34 {
 35     int i;  
 36     printf("\n输入作业数:"); 
 37     scanf("%d",&n); 
 38     for(i=0;i<n;i++)     
 39     {          
 40         p=getpch(JCB);          
 41         printf("\n输入作业名:");         
 42         scanf("%s",p->name);         
 43         getch();
 44         p->reachtime=i;          
 45         printf("作业默认到达时间:%d",i);         
 46         printf("\n输入作业需运行时间:");         
 47         scanf("%d",&p->needtime);         
 48         p->state='W';         
 49         p->next=NULL;          
 50         if(ready==NULL)  
 51             ready=q=p;         
 52         else{              
 53             q->next=p;             
 54             q=p;             
 55         }     
 56     } 
 57 }
 58 void disp(JCB* q,int m) //显示作业运行后的周转时间及带权周转时间等 
 59 {
 60      if(m==3)             //显示高响应比算法调度作业后的运行情况 
 61      {    
 62          printf("\n作业%s正在运行,估计其运行情况:\n",q->name);   
 63          printf("\n 开始运行时刻 \t 完成时刻 \t 周转时间 \t 带权周转时间 \t相应比 \n");     
 64          printf(" %d    \t",q->starttime);     
 65          printf("           %d    \t",q->finishtime);    
 66          printf(" %f    \t",q->cycletime);    
 67          printf(" %f\t",q->cltime);    
 68          printf(" %f\n",q->super);   
 69          getch();     
 70      } 
 71      else      // 显示先来先服务,最短作业优先算法调度后作业的运行情况     
 72      {     
 73          printf("\n作业%s正在运行,估计其运行情况:\n",q->name);   
 74          printf("\n 开始运行时刻 \t 完成时刻 \t 周转时间 \t 带权周转时间 \n");     
 75          printf(" %d    \t",q->starttime);     
 76          printf("           %d    \t",q->finishtime);    
 77          printf(" %f    \t",q->cycletime);    
 78          printf(" %f\t",q->cltime);    
 79          getch();     
 80      } 
 81 }
 82 void running(JCB *p,int m)      //运行作业 
 83 {            
 84     if(p==ready)         //先将要运行的作业从队列中分离出来
 85     {
 86                          
 87         ready=p->next;                 
 88         p->next=NULL;             
 89     }             
 90     else
 91     {                  
 92         q=ready;                  
 93         while(q->next!=p)  
 94             q=q->next;                 
 95         q->next=p->next;            
 96     }        
 97     p->starttime=times;//计算作业运行后的完成时间,周转时间等等             
 98     p->state='R';              
 99     p->finishtime=p->starttime+p->needtime;              
100     p->cycletime=(float)(p->finishtime-p->reachtime);             
101     p->cltime=(float)(p->cycletime/p->needtime);             
102     T1+=p->cycletime;             
103     T2+=p->cltime;              
104     disp(p,m);        //调用disp()函数,显示作业运行情况             
105     times+=p->needtime;             
106     p->state='F';          
107     printf("\n%s 作业已完成!\n请按任意键继续...\n",p->name);             
108     free(p);          //释放运行后的作业             
109     getch(); 
110 } 
111 void super()          //计算队列中作业的高响应比 
112 {    
113     JCB *padv;   
114     padv=ready;  
115     do{      
116         if(padv->state=='W'&&padv->reachtime<=times)  
117             padv->super=(float)(times-padv->reachtime+padv->needtime)/padv->needtime;      
118         padv=padv->next;    
119     }
120     while(padv!=NULL); 
121 }  
122 void final()       //最后打印作业的平均周转时间,平均带权周转时间 
123 {      
124     float s,t;     
125     t=T1/n;     
126     s=T2/n;    
127     getch();     
128     printf("\n\n作业已经全部完成!");     
129     printf("\n%d个作业的平均周转时间是:%f",n,t);    
130     printf("\n%d个作业的平均带权周转时间是:%f\n\n\n",n,s); 
131 }
132 void hrn(int m)      //高响应比算法 
133 {    
134     JCB *min;   
135     int i,iden;   
136     system("cls");   
137     inital();    
138     for(i=0;i<n;i++)     
139     {          
140         p=min=ready;
141         iden=1;         
142         super();         
143         do{              
144             if(p->state=='W'&&p->reachtime<=times)                 
145                 if(iden)                     
146                 {                          
147                     min=p;
148                     iden=0;                     
149                 }                  
150                 else if(p->super>min->super) 
151                     min=p;             
152                 p=p->next;         
153         }while(p!=NULL);         
154         if(iden)              
155         {                
156             i--;
157             times++;                 
158             if(times>1000)  
159             {
160                 printf("\nruntime is too long...error...");
161                 getch();
162             }             
163         }         
164         else             
165         {               
166             running(min,m);      //调用running()函数         
167         }      
168     }   //for      
169 
170     final();           //调用running()函数 
171 } 
172 void sjf(int m)      // 最短作业优先算法 
173 {      
174     JCB *min;     
175     int i,iden;     
176     system("cls");     
177     inital();      
178     for(i=0;i<n;i++) 
179     {          
180         p=min=ready;
181         iden=1;         
182         do{ 
183             if(p->state=='W'&&p->reachtime<=times)                 
184                 if(iden)
185                 {                          
186                     min=p;iden=0;                     
187                 }                  
188                 else if(p->needtime<min->needtime) min=p;             
189             p=p->next;
190             }
191         while(p!=NULL);
192                 if(iden) 
193                 {             
194                     i--;               
195                     times++;     
196                     if(times>100)
197                     {
198                         printf("\nruntime is too long...error");
199                         getch();
200                     }             
201                 }         
202                 else{              
203                     running(min,m);      //调用running()函数         
204                 }     
205     }  //for     
206     final();      //调用running()函数 
207 }
208 void fcfs(int m)     //先来先服务算法 
209 {      
210     int i,iden;     
211     system("cls");     
212     inital();      
213     for(i=0;i<n;i++)         
214     {             
215         p=ready;
216         iden=1;           
217         do{                
218             if(p->state=='W'&&p->reachtime<=times)  iden=0;               
219             if(iden)p=p->next;              
220         }while(p!=NULL&&iden);            
221             if(iden)             
222             {              
223                 i--;               
224                 printf("\n没有满足要求的进程,需等待");              
225                 times++;               
226                 if(times>100){printf("\n时间过长");
227                 getch();
228                 }             
229             }         
230             else{              
231                 running(p,m);    //调用running()函数          
232             }       
233     }      
234     final();        //调用running()函数 
235 }
236 void mune() 
237 {   
238     int m;    
239     system("cls");  
240     printf("\n\n\t\t*********************************************\t\t\n"); 
241     printf("\t\t\t\t作业调度主菜单\n");  
242     printf("\t\t*********************************************\t\t\n");   
243     printf("\n\n\n\t\t\t1.先来先服务算法");  
244     printf("\n\t\t\t2.最短作业优先算法");  
245     printf("\n\t\t\t3.响应比高者优先算法");  
246     printf("\n\t\t\t0.退出程序");  
247     printf("\n\n\t\t\t\t选择算法:");  
248     scanf("%d",&m); 
249     switch(m)   
250     {      
251     case 1:       
252         fcfs(m);       
253         getch();         
254         system("cls");        
255         mune();       
256         break;    
257     case 2:       
258         sjf(m);       
259         getch();        
260         system("cls");       
261         mune();       
262         break;    
263     case 3:       
264         hrn(m);       
265         getch();         
266         system("cls");      
267         mune();       
268         break;    
269     case 0:       
270         system("cls");      
271         break;    
272     default:       
273         printf("选择错误,重新选择.");       
274         getch();        
275         system("cls");       
276         mune();   
277     } 
278 }
279 main()
280 {
281     mune();
282     inize();
283 }

 

posted on 2016-06-03 15:50  QIMark  阅读(313)  评论(0编辑  收藏  举报