操作系统 实验二

实验二作业调度模拟程序

一、目的和要求

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

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

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

6

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

 输入:读取文件

输出:显示详细

 

五、       其他要求

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

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

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

二、实验内容

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

、实验环境

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

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

     单道FCFS算法:

 

源程序:

  1 #include <stdio.h>
  2 
  3 struct job
  4 {
  5     int  name;
  6     char status;
  7 
  8 
  9     int arrtime;  //到达时间 
 10     int reqtime;  //要求服务时间
 11     int startime; //开始时间
 12     int finitime; //完成时间
 13     int waittime;
 14 
 15     float TAtime;  //作业周转时间
 16     float TAWtime; //带权作业周转时间
 17     float prio;  //作业响应比
 18 }jobarr[24], jobfin[24], job[24];
 19 
 20 int systime = 0;
 21 int intarr, intfin, intjob;
 22 
 23 void scan()
 24   {
 25       int n,j;
 26       int i=1;
 27     struct job p;
 28       printf("作业个数:");
 29       scanf("%d",&n);
 30       for(i=1;i<n+1;i++){
 31           printf("\n第%d个作业:",i);
 32           printf("\n请输入作业名:");
 33           scanf("%d",&job[i].name);
 34           printf("到达时间:");
 35         scanf("%d",&job[i].arrtime);
 36           printf("要求服务时间:");
 37           scanf("%d",&job[i].reqtime);
 38           jobarr[i]=job[i];
 39       }
 40         printf("经过到达时间排序后,未达到队列是");
 41         printf("\n\t\t\t名字\t到达时间\t要求服务时间\n");
 42         for(i=1;i<n+1;i++)
 43     {
 44         for(j=i+1;j<n+1;j++)
 45         {
 46             if(job[i].arrtime>job[j].arrtime)
 47             {
 48                 p=job[i];
 49                 job[i]=job[j];
 50                 job[j]=p;
 51             }
 52         }
 53     }
 54         for(i=1;i<n+1;i++)
 55         {
 56             printf("\t\tN %d\t%d\t%d\t\t%d\n",i,job[i].name,job[i].arrtime,job[i].reqtime);
 57         }
 58         printf("\n\t\t\t现在系统时间 0:\n");      
 59       
 60   }
 61 
 62 
 63 
 64 void sort(int n)   //按到达时间排序
 65 {
 66     int i,j; 
 67     
 68     struct job temp;
 69     for(i=1;i<n;i++){ 
 70         for(j=i+1;j<=n;j++){ 
 71     if(job[i].arrtime>job[j].arrtime) //根据到达时间排序
 72     { 
 73        temp=job[i]; 
 74        job[i]=job[j]; 
 75        job[j]=temp; 
 76     }
 77 }
 78     }
 79 }
 80 
 81 void FCFS()//FCFS算法调度
 82 {
 83     int i=1,j=1;
 84     float sumTA=0,sumTAW=0;
 85     printf("**********************先来先服务算法FCFS********************\n");
 86     printf("\n 作业名    作业到达时间     作业运行所需要时间\n");
 87     
 88     while(job[j].name!=NULL)
 89     {
 90         printf("\n%d%12d%15d",job[j].name,job[j].arrtime,job[j].reqtime);  //打印
 91         j++;
 92     }
 93     sort(j-1);
 94     printf("\n\n作业名    作业到达时间   作业完成时间   运行时间  作业周转时间  带权作业周转时间\n");
 95    
 96     while(job[i].name!=NULL)
 97     {
 98         if(i==1)
 99         {
100             job[i].startime=job[i].arrtime; //最先到达先运行
101         }
102         else
103         {
104             if(job[i-1].finitime>=job[i].arrtime) //如果前一个的时间大于等于这个的到达时间
105                 job[i].startime=job[i-1].finitime;  //后一个的开始时间等于这个时间的完成时间
106             else
107                 job[i].startime=job[i].arrtime;       //否则这个的到达时间就是它的开始时间
108         }
109         job[i].finitime=job[i].startime+job[i].reqtime;  //求完成时间
110         job[i].TAtime=job[i].finitime-job[i].arrtime;    //周转时间
111         job[i].TAWtime=job[i].TAtime/job[i].reqtime;   //带权周转时间
112         sumTA+=job[i].TAtime;  //周转时间和
113         sumTAW+=job[i].TAWtime; //带权周转时间和
114         printf("\n%d%12d%13d%14d%12.0lf%14.2lf",job[i].name,job[i].arrtime,job[i].finitime,job[i].reqtime,job[i].TAtime,job[i].TAWtime); 
115         i++;
116     }
117     printf("\n平均作业周转时间= %.2lf",sumTA/(i-1));   
118     printf("\n平均带权作业周转时间= %.2lf",sumTAW/(i-1));
119     printf("\n\n");
120 }
121 
122 void SJF()//SJF算法调度
123 {
124     int n;
125     int i=1,j=1;
126     float sumTA=0,sumTAW=0;
127     printf("\n******************最短作业优先算法SJF*********************\n");
128    printf("\n 作业名    作业到达时间     作业运行所需要时间\n");
129     while(job[j].name!=NULL)
130     {
131         printf("\n%d%12d%15d",job[j].name,job[j].arrtime,job[j].reqtime);  //打印
132         j++;
133     }
134     printf("\n\n 作业名    作业到达时间   作业完成时间   运行时间  作业周转时间  带权作业周转时间\n");
135     while(job[i].name!=NULL)
136     {
137         if(i==1)
138         {
139             job[i].startime=job[i].arrtime;
140         }
141         else
142         {
143             if(job[i-1].finitime>=job[i].arrtime)
144                 job[i].startime=job[i-1].finitime;
145             else
146                 job[i].startime=job[i].arrtime;
147         }
148         job[i].finitime=job[i].startime+job[i].reqtime;  //求完成时间
149         job[i].TAtime=job[i].finitime-job[i].arrtime;   //周转时间
150         job[i].TAWtime=job[i].TAtime/job[i].reqtime;   //带权周转时间
151         sumTA+=job[i].TAtime;       //周转时间和
152         sumTAW+=job[i].TAWtime;        //带权周转时间和
153         printf("\n%d%12d%13d%14d%12.0lf%14.2lf",job[i].name,job[i].arrtime,job[i].finitime,job[i].reqtime,job[i].TAtime,job[i].TAWtime); 
154         i++;
155     }
156         printf("\n平均作业周转时间= %.2lf",sumTA/(i-1));
157         printf("\n平均带权作业周转时间= %.2lf",sumTAW/(i-1));
158         printf("\n");
159 }
160 
161 void HRRF(int n)
162 {
163     int n;
164     int i=1,j=1;
165     float sumTA=0,sumTAW=0;
166     printf("\n******************最短作业优先算法SJF*********************\n");
167     printf("\n 作业名    作业到达时间     作业运行所需要时间\n");
168     while(job[j].name!=NULL)
169     {
170         printf("\n%d%12d%15d",job[j].name,job[j].arrtime,job[j].reqtime);  //打印
171         j++;
172     }
173 
174 
175 }
176 
177 
178 
179 void menu(){
180     int b;
181     int n;
182     while (1){
183     printf("\n\n\n\t\t********************************\n");
184     printf("\t\t    1. FCFS算法调度\n");
185     printf("\t\t    2. SJF算法调度\n");
186     printf("\t\t    3. HRRF算法调度\n");
187     printf("\t\t    4. 调用系统清屏\n");
188     printf("\t\t    0. 退出算法调度\n");
189     printf("\t\t********************************\n\n");
190 
191     printf("\t请选择菜单项:");
192     scanf("%d", &b);
193     switch(b)
194     {
195     case 1:
196         FCFS();
197         break;
198     case 2:
199         SJF();
200         break;
201     case 3:
202         //hrrf();
203         break;
204     }
205     }
206 
207     
208 }
209 
210 int main()
211 {
212     int a,b;
213 
214     while(1)
215     {    printf("\t\t********************************\n");
216     /*printf("\t\t    1. 调用文本写入数据\n");
217     printf("\t\t    2. 调用随机数产生的数据\n");*/
218     printf("\t\t    3. 调用自己填入模拟数据\n");
219     printf("\t\t********************************\n\n");
220     
221     printf("\n请选择菜单项:");
222     scanf("%d",&a);
223     switch (a)
224     {
225     case 1:
226         //ReadFile();
227         break;
228     case 2:
229         //Pseudo_random_number();
230         break;
231     case 3:    
232         scan();
233         break;
234     }
235     
236     menu();
237     printf("\n");
238     }
239     return 0;
240 }

 

总结:     由于之前的c语言学的不是很好,发现在这次编程中比较吃力,对算法的理解也是比较差,然后需要多多查找资料,理解其中算法的意思。但是也是有

        些收获,对作业的调度也有一定的理解。

posted @ 2016-03-31 19:25  J航  阅读(407)  评论(0编辑  收藏  举报