实验二
源程序名:作业调度.cpp
- 1. 原理分析及流程图
存储结构:结构体数组。
主要算法:排序算法跟最大值算法
关键函数:循环嵌套
- 2. 主要程序段及其解释:
看提交的代码
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include <conio.h>
4
5
6 struct Job {
7 //定义作业控制块JCB
8 char name[10]; //作业名
9 float subtime; //作业提交时间
10 float runtime; //作业所需的运行时间
11
12 float Tb; //作业运行时刻
13 float Tc; //作业完成时刻
14 float Ti; //周转时间
15 float Wi; //带权周转时间
16
17 };
18 struct Job job[24]={0};
19
20 int input(Job *j,int n);//输入作业内容
21 void output(Job *j,int n);//输出作业内容
22 void FCFS(Job *j,int n);
23 float addallruntime(Job *j,int n);//得到总的时间
24 void SJF(Job *j,int n,float allruntime);
25 void HRRF(Job *j,int n,float allruntime);
26 int main()
27 {
28 int n=0;
29 int i;
30 float a=0.0,b=0.0;//a存放作业平均周转时间,b存放平均带权周转时间
31 float allruntime=0.0;
32 printf("*********欢迎使用作业调度模拟系统***********\n");
33 n=input(job,n);
34 allruntime=addallruntime(job,n);
35
36 printf("\n1.FCFS 2.SJF 3.HRN");
37 printf("\n请选择作业调度算法:");
38 scanf("%d",&i);
39 if(i==1)
40 {
41 FCFS(job,n);
42 }
43 else if(i==2)
44 {
45 SJF(job,n,allruntime);
46 }else if(i==3)
47 {
48 HRRF(job,n,allruntime);
49 }
50 else
51 {
52
53 }
54
55 printf("\n*******运行结果*********");
56
57 output(job,n);
58 for(i=0;i<n;i++)
59 {
60 a=a+job[i].Ti;
61 }
62 a=a/n;
63 printf("\n此调度的平均周转时间:%f",a);
64 for(i=0;i<n;i++)
65 {
66 b=b+job[i].Wi;
67 }
68 b=b/n;
69 printf("\n此调度的带权平均周转时间:%f\n",b);
70
71 return 0;
72 }
73 int input(Job *j,int n)//输入作业
74 {
75
76 int i;
77 printf("请输入作业数:");
78 scanf("%d",&n);
79 for(i=0;i<n;i++)
80 {
81 printf("\n作业号%d:",i);
82 printf("\n请输入作业名");
83 scanf("%s",job[i].name);
84
85
86 printf("\n请输入作业提交时刻");
87 scanf("%f",&job[i].subtime);
88
89 printf("\n请输入作业运行时间");
90 scanf("%f",&job[i].runtime);
91
92
93 }
94
95 return n;
96
97 }
98 void output(Job *j,int n)//打印输出作业信息
99
100 {
101 int i;
102 printf("\n各个作业的情况");
103 printf("\n作业名");
104
105 printf(" 作业运行时刻");
106 printf(" 作业完成时刻");
107 printf(" 周转时间");
108 printf(" 带权周转时间");
109
110
111
112 for(i=0;i<n;i++)
113 {
114
115 printf("\n%s",j[i].name);
116
117 printf(" %f",j[i].Tb);
118 printf(" %f",j[i].Tc);
119 printf(" %f",j[i].Ti);
120 printf(" %f",j[i].Wi);
121 }
122
123 }
124
125 float addallruntime(Job *j,int n)//得到所有作业运行时间
126 {
127 int i;
128 float allruntime=0.0;
129 for(i=0;i<n;i++)
130 {
131
132
133 allruntime=allruntime+job[i].runtime;
134 }
135 return allruntime;
136 }
137
138 void FCFS(Job *j,int n)
139 {
140 int i;
141 j[0].Tb=j[0].subtime;
142 j[0].Tc=j[0].Tb+j[0].runtime;
143 j[0].Ti=j[0].Tc-j[0].subtime;
144 j[0].Wi=j[0].Ti/j[0].runtime;
145 for(i=1;i<n;i++)
146 {
147
148 j[i].Tb=j[i-1].Tc;
149 j[i].Tc=j[i].Tb+j[i].runtime;
150 j[i].Ti=j[i].Tc-j[i].subtime;
151 j[i].Wi=j[i].Ti/j[i].runtime;
152
153 }
154 }
155 void SJF(Job *j,int n,float allruntime)
156 {
157 float mintime=0;
158 Job jtemp={0};
159
160 int min=0;
161
162 int startwork=0;
163 float i;
164 int k;
165 for(i=0;i<allruntime;)
166 {
167 mintime=j[startwork].runtime;//假设一个剩余时间的最小值
168 for(k=startwork;k<n;k++)
169 {
170
171 if(j[k].runtime<=mintime&&j[k].subtime<=i)//此作业的剩余时间更少则将其记为最少
172 {
173 mintime=j[k].runtime;
174 min=k;
175 }
176
177 }
178 j[min].Tb=i;
179
180 j[min].Tc=j[min].Tb+j[min].runtime;
181 j[min].Ti=j[min].Tc-j[min].subtime;
182 j[min].Wi=j[min].Ti/j[min].runtime;
183
184 jtemp=j[startwork];
185 j[startwork]=j[min];
186 j[min]=jtemp;
187
188 startwork++;
189
190 i=i+mintime;
191 }
192
193 }
194 void HRRF(Job *j,int n,float allruntime)
195 {
196
197 float maxrb=0;
198 Job jtemp={0};
199
200 int z=0;
201 float time=0;
202 int startwork=0;
203 float i;
204 int k;
205 for(i=0;i<allruntime;)
206 {
207 maxrb=(i-j[startwork].subtime)/j[startwork].runtime+1;//假设是最高响应比
208
209 for(k=startwork;k<n;k++)
210 {
211
212
213
214 if(j[k].subtime<=i&&(i-j[k].subtime)/j[k].runtime+1>=maxrb)//此作业的最高响应比更高,则将其记为更高
215 {
216 time=j[k].runtime;
217
218 z=k;
219 }
220
221 }
222
223
224 j[z].Tb=i;
225 j[z].Tc=j[z].Tb+j[z].runtime;
226 j[z].Ti=j[z].Tc-j[z].subtime;
227 j[z].Wi=j[z].Ti/j[z].runtime;
228
229 jtemp=j[startwork];
230 j[startwork]=j[z];
231 j[z]=jtemp;
232
233
234
235 startwork++;
236 i=i+time;
237 }
238 }






浙公网安备 33010602011771号