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

实验二 作业调度模拟程序

时间:2016-04-21 23:18:20      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:

实验二作业调度模拟程序

专业:商业软件工程2班   姓名:柯晓君  学号:201406114210

一、目的和要求

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

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

  1. 先来先服务调度算法
  2. 短作业优先调度算法
  3. 响应比高者优先调度算法
  4. 优先数调度算法
  5. 均衡调度算法

5

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

 

6

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

 

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

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

可执行程序名:c2.exe

2.原理分析及流程图

 

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

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

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define N 100
  4 typedef struct jcb{
  5       char name[10];
  6       int subtime; //提交时间
  7       int runtime;    //要求运行时间
  8       int statime;  //开始运行时间或调度时间
  9       int waitime;
 10       int fintime; //完成时间
 11       int zztime;     //周转时间
 12       double wzztime;    //带权周转时间
 13       double prio;    //响应比
 14 }jcb;
 15 jcb job[N];
 16 double sumzztime;     //总周转时间
 17 double sumwzztime;    //总带权周转时间
 18 double avgzztime;     //平均周转时间
 19 double avgwzztime;    //平均带权周转时间
 20   
 21 int ReadFile()
 22 {
 23     int m=0;
 24     int i=0;
 25     FILE *fp;     //定义文件指针
 26     fp=fopen("3.txt","r");  //打开文件
 27     if(fp==NULL)
 28     {
 29         printf("File open error !\n");
 30         exit(0);
 31     }
 32     else
 33     {
 34         while(!feof(fp))
 35         {
 36             fscanf(fp,"%s%d%d",&job[i].name,&job[i].subtime,&job[i].runtime);  //fscanf()函数将数据读入
 37             i++;
 38         }
 39         fclose(fp);   //关闭文件
 40     }
 41         m=i-1;
 42         return m;
 43 
 44 }
 45 
 46 void Menu() 
 47 {   
 48     printf("\n\n\t\t****************************************\n");  
 49     printf("\t\t||         作业调度演示               ||\n");   
 50     printf("\t\t||************************************||\n"); 
 51     printf("\t\t||                                    ||\n");
 52     printf("\t\t||      1.先来先服务算法              ||\n");  
 53     printf("\t\t||      2.最短作业优先算法            ||\n");  
 54     printf("\t\t||      3.最高响应比优先算法          ||\n");  
 55     printf("\t\t||      0.退出程序                    ||\n");   
 56     printf("\t\t****************************************\n");     
 57 }  
 58 void Show(jcb job[],int n)
 59 {
 60     int i;
 61     printf("原始数据是:");
 62     printf("\n作业名    作业到达时间     作业运行所需要时间\n");
 63     for(i=0;i<n;i++)
 64     {
 65         printf("\n%s%12d%15d",job[i].name,job[i].subtime,job[i].runtime);  //输出到屏幕
 66     }
 67     printf("\n");
 68 }
 69 void Sort(jcb job[],int n)
 70 {
 71      int i,j;
 72      jcb temp;
 73      for(i=0;i<n;i++)
 74       {
 75           for(j=i+1;j<n;j++)
 76               if(job[j].subtime<job[i].subtime)
 77               {
 78                  temp=job[j];
 79                  job[j]=job[i];
 80                  job[i]=temp;
 81              }
 82      }
 83 }
 84 
 85 void Handle(jcb joc[],int n,int times)
 86 {
 87     int i,j;
 88     sumzztime=sumwzztime=0;
 89     job[0].statime=job[0].subtime;
 90     job[0].fintime=job[0].statime+job[0].runtime;
 91     printf("===============================\n");
 92     printf("%s is running.....\n",job[0].name);
 93     printf("经按到达时间排序后,未达到队列是\n");
 94     printf("name  subtime runtime\n");
 95     for(i=1;i<n;i++)
 96      {
 97          if(job[i].subtime>times)
 98          printf("%s\t%d\t%d\n",job[i].name,job[i].subtime,job[i].runtime);
 99    
100      printf("\n");
101          
102      }
103      times=job[0].statime;
104      printf("\t\t现在系统时间: %d\n\n",times);
105      printf("===============================\n");
106     for(i=1;i<n;i++)
107     {
108             if(job[i-1].fintime>job[i].subtime)
109             {
110                 job[i].statime=job[i-1].fintime;
111                 job[i].fintime=job[i].statime+job[i].runtime;
112             }
113             else
114             {
115                 job[i].statime=job[i].subtime;
116                 job[i].fintime=job[i].statime+job[i].runtime;
117             }
118 
119         printf("%s is running......\n",job[i].name);
120         for(j=0;j<i;j++)
121             {
122                 printf("%s ",job[j].name);
123             }
124             printf("  is finished !\n\n");
125         times=job[i].statime;
126         printf("\t\t现在系统时间:  %d\n\n",times);
127         printf("===============================\n");
128     }
129         for(i=0;i<n;i++)
130         {
131             job[i].zztime=job[i].fintime-job[i].subtime;
132              job[i].wzztime=(job[i].zztime*1.0)/(job[i].runtime*1.0);
133             sumzztime+=job[i].zztime;
134             sumwzztime+=job[i].wzztime; 
135         }
136     avgzztime=sumzztime/n;
137     avgwzztime=sumwzztime/n;
138 }
139 void Output(jcb job[],int n)
140 {
141     int i;
142     printf("name\tsubtime\truntime\tstatime\tfintime\tzztime\twzztime\n");
143     for(i=0;i<n;i++)
144     {
145         printf("%s\t %d\t %d\t %d\t %d\t %d\t %.2f\n",job[i].name,job[i].subtime,job[i].runtime,job[i].statime,job[i].fintime,job[i].zztime,job[i].wzztime);
146     }
147     printf("\n平均作业周转时间为: %.2f",avgzztime);
148     printf("\n平均带权作业周转时间为: %.2f",avgwzztime);
149     printf("\n");
150 }
151  
152 FCFS(jcb job[],int n,int times)
153 {
154     Show(job,n);
155     Sort(job,n);
156     printf("\n先来先服务算法的调度过程:\n");
157     Handle(job,n,times);
158     printf("\n先来先服务调度算法得到的结果如下:\n");
159     Output(job,n);
160 
161 }
162 SJF(jcb job[],int n,int times)
163 {
164     int i,j;
165     jcb temp;
166     Show(job,n);
167     Sort(job,n);
168     for(i=1;i<n;i++)
169     {
170         for(j=i+1;j<n;j++)
171             if(job[j].runtime<job[i].runtime)
172              {
173                 temp=job[j];
174                 job[j]=job[i];
175                 job[i]=temp;
176              }
177     }
178     printf("\n最短作业优先算法的调度过程:\n");
179     Handle(job,n,times);
180     printf("\n最短作业优先调度算法得到的结果如下:\n");
181     Output(job,n); 
182 }
183 
184 HRRF(jcb job[],int n)
185 {
186     /*int i,j;
187     jcb temp;
188     Show(job,n);
189     Sort(job,n);
190     job[0].statime=job[0].subtime;
191     job[0].fintime=job[0].statime+job[0].runtime;
192     for(i=1;i<n-1;i++)
193     {
194             if(job[i-1].fintime>job[i].subtime)
195             {
196                 job[i].statime=job[i-1].fintime;
197                 job[i].fintime=job[i].statime+job[i].runtime;
198             }
199             else
200             {
201                 job[i].statime=job[i].subtime;
202                 job[i].fintime=job[i].statime+job[i].runtime;
203             }
204             job[i].zztime=job[i].fintime-job[i].subtime;
205             job[i].prio=job[i].zztime/job[i].runtime;
206     }
207      for(i=1;i<n;i++)
208       {
209           for(j=i+1;j<n;j++)
210               if(job[j].prio>job[i].prio)
211               {
212                  temp=job[j];
213                  job[j]=job[i];
214                  job[i]=temp;
215              }
216      }
217      printf("作业名\t最高响应比\n");
218      for(i=1;i<n;i++)
219          printf("%s\t%d\n",job[i].name,job[i].prio);
220      printf("\n最高响应比优先调度算法得到的结果如下:\n");
221      Output(job,n); */
222 
223 }
224 
225 int main()
226 {
227     int n,m,times=0;
228     n=ReadFile();
229     while(1)
230     {
231     Menu();
232     printf("\n\t\t选择所要操作:");  
233     scanf("%d",&m); 
234     switch(m)   
235     {      
236     case 1:       
237         FCFS(job,n,times);                              
238         break;    
239     case 2:       
240         SJF(job,n,times);                         
241         break;    
242     case 3:       
243         HRRF(job,n);                        
244         break;    
245     case 0:       
246         exit(0);
247         break;    
248     default: 
249         printf("选择错误,请重新选择!");                    
250     } 
251     }
252      printf("\n");
253      return 0;
254 }

 

实验二 作业调度模拟程序

标签:

原文地址:http://www.cnblogs.com/950525kxj/p/5419287.html

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