一、目的和要求

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

#define H_H

#include <stdio.h>
#include <stdlib.h>

int readFile();
int randNumber();
void FCFS(int n);
void SJF(int n);
void HRRF(int n);

#endif H_H

 

posted on 2016-04-22 12:29  29刘皓  阅读(158)  评论(0编辑  收藏  举报