陈志昊201306104104 物联网1301
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. 实验须检查,回答实验相关问题。
注:带**号的条目表示选做内容。
二、实验内容
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
三、实验环境
可以采用TC,也可以选用Windows下的利用各种控件较为方便的VB,VC等可视化环境。也可以自主选择其他实验环境。
三、 实验方法、步骤及结果测试
1.源程序名winner.c
可执行程序名:winner.exe
2.原理分析及流程图
3.主要程序段及其解释:
1 #include<stdio.h>
2 #include<string.h>
3 #define J 100
4 typedef struct Tony{
5 char name[50];
6 int enter;
7 int start;
8 int run;
9 int finish;
10 int total;
11 float respond;
12 int status;
13 }t;
14 void fcf(t job[],int n)
15 {
16 int y,a,i,trick=0;
17 t jobtemp;
18 for(y=0;y<n;y++)
19 {
20 for(a=y+1;a<n;a++)
21 {
22 if(job[a].enter<job[y].enter)
23 {
24 strcpy(jobtemp.name,job[a].name);
25 strcpy(job[a].name,job[y].name);
26 strcpy(job[y].name,jobtemp.name);
27 jobtemp.enter=job[a].enter;
28 job[a].enter=job[y].enter;
29 job[y].enter=jobtemp.enter;
30 jobtemp.run=job[a].run;
31 job[a].run=job[y].run;
32 job[y].run=jobtemp.run;
33 }
34 }
35 }
36 for(y=0;y<n;y++)
37 {
38 if(job[y].enter<=trick)
39 job[y].start=trick;
40 else
41 job[y].start=job[y].enter;
42 trick=job[y].run+job[y].start;
43 job[y].finish=job[y].run+job[y].start;
44 job[y].total=job[y].finish-job[y].enter;
45 job[y].respond=(float)(job[y].total)/(float)(job[y].run);
46 }
47 printf("\n\nJesus! you've finished FCFS,congratulations!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n");
48 for(i=0;i<n;i++)
49 {
50 printf("%s\t%d\t%d\t%d\t%d\t%.3f\t%d\n",job[i].name,job[i].enter,job[i].start,job[i].run,job[i].total,job[i].respond,job[i].finish);
51 }
52 }
53 void hrr(t job[],int n)
54 {
55 int i,s;
56 int now=0;
57 t jobtemp;
58 for(s=0;s<n;s++)
59 {
60 for(i=s+1;i<n;i++)
61 {
62 if((job[s].enter>job[i].enter)||((job[s].enter==job[i].enter)&&(job[s].run<job[i].run)))
63 {
64 strcpy(jobtemp.name,job[s].name);
65 strcpy(job[s].name,job[i].name);
66 strcpy(job[i].name,jobtemp.name);
67 jobtemp.enter=job[s].enter;
68 job[s].enter=job[i].enter;
69 job[i].enter=jobtemp.enter;
70 jobtemp.run=job[s].run;
71 job[s].run=job[i].run;
72 job[i].run=jobtemp.run;
73 }
74 }
75 }
76 for(s=0;s<n;s++)
77 {
78 if(job[s].enter<=now)
79 job[s].start=now;
80 else
81 job[s].start=job[s].enter;
82 now=job[s].start+job[s].run;
83 job[s].finish=now;
84 job[s].total=job[s].finish-job[s].enter;
85 job[s].respond=(float)(job[s].total)/(float)(job[s].run);
86 }
87 printf("\n\nGoddamn it! hrr complete,excellent job!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n");
88 for(i=0;i<n;i++)
89 {
90 printf("%s\t%d\t%d\t%d\t%d\t%.3f\t%d\n",job[i].name,job[i].enter,job[i].start,job[i].run,job[i].total,job[i].respond,job[i].finish);
91 }
92 }
93 void secon(t job[],int n)
94 {
95 int d,s,i,now=0;
96 t jobtemp;
97 for(d=0;d<n;d++)
98 {
99 for(s=d+1;s<n;s++)
100 {
101 if(job[d].enter>=job[s].enter)
102 {
103 strcpy(jobtemp.name,job[d].name);
104 strcpy(job[d].name,job[s].name);
105 strcpy(job[s].name,jobtemp.name);
106 jobtemp.enter=job[d].enter;
107 job[d].enter=job[s].enter;
108 job[s].enter=jobtemp.enter;
109 jobtemp.run=job[d].run;
110 job[d].run=job[s].run;
111 job[s].run=jobtemp.run;
112 }
113 }
114 }
115 for(d=0;d<n;d++)
116 {
117 if(job[d].status==0)
118 {
119 if(job[d].enter>now)
120 now=job[d].enter;
121 for(s=d+1;s<n;s++)
122 {
123 if((job[s].status==0)&&(job[s].run<job[d].run)&&(job[s].enter<now))
124 {
125
126 strcpy(jobtemp.name,job[d].name);
127 strcpy(job[d].name,job[s].name);
128 strcpy(job[s].name,jobtemp.name);
129 jobtemp.enter=job[d].enter;
130 job[d].enter=job[s].enter;
131 job[s].enter=jobtemp.enter;
132 jobtemp.run=job[d].run;
133 job[d].run=job[s].run;
134 job[s].run=jobtemp.run;
135
136 }
137 }
138 }
139 job[d].start=now;
140 job[d].finish=job[d].start+job[d].run;
141 job[d].total=job[d].finish-job[d].enter;
142 job[d].status=1;
143 now+=job[d].run;
144 job[d].respond=(float)(job[d].total)/(float)(job[d].run);
145
146 }
147
148 printf("\n\nJesus! you've finished SJF,well done!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n");
149 for(i=0;i<n;i++)
150 {
151 printf("%s\t%d\t%d\t%d\t%d\t%.3f\t%d\n",job[i].name,job[i].enter,job[i].start,job[i].run,job[i].total,job[i].respond,job[i].finish);
152 }
153 }
154 main()
155 {
156 t job [J];
157 int n,i,w;
158 printf("The copyright is mine-Tony Chan,do not be a copycat,thx!\n\n now just enjoy the fascinating C#project~~\n\n");
159 printf("enter the quantity of the array: ");
160 scanf("%d",&n);
161 printf("please input na en run respectively :-) \n");
162 for(i=0;i<n;i++)
163 {
164 printf("this is NO.%d\n",i+1);
165 scanf("%s",&job[i].name);
166 scanf("%d",&job[i].enter);
167 scanf("%d",&job[i].run);
168 job[i].status=0;
169 }
170 printf("Now you got %d job(s)\n",n);
171 printf("name\tenter\trun\n");
172 for(i=0;i<n;i++)
173 {
174 printf("%s\t%d\t%d\n",job[i].name,job[i].enter,job[i].run);
175 }
176 do{
177 printf("\n\nWhich methods you are eager to choose ? :-) \n 1.fcf 2.hrr 3.secon (pressing other number means quit)\n");
178 scanf("%d",&w);
179 switch(w)
180 {
181 case 1:
182 fcf(job,n);
183 break;
184 case 2:
185 hrr(job,n);
186 break;
187 case 3:
188 secon(job,n);
189 break;
190 default:
191 w=0;
192 break;
193 }
194 }while(w);
195 }
4.运行结果及分析
初始化输入作业,然后进行调度.
先来先处理和最高响应比算法的实现. 最短处理时间优先法的运行.
四、 实验总结
这次实验是开学以来这门课程最难的实验,就我而言,非常有挑战性.但是我也是愿意接受挑战.
首先这实验基于进程调度的,因此单位时间内CPU只能调用一个作业。
其次我们要了解这3个方法的规则,还有分清具体的运算逻辑。
总而言之这次实验难度较大,但是我受益匪浅。