一、实验目的

用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

二、实验要求

设计一个有 N个进程并发执行的进程调度模拟程序。

1.模拟进程数据的生成

允许用户指定作业的个数(2-24),默认值为5。

允许用户选择输入每个进程的到达时间,所需运行时间,进程的运行时间以时间片为单位。

2. 模拟调度程序的功能

2.1 按照模拟数据的到达时间和所需运行时间,能分别执行以下调度算法。

FCFS     SJ      HRRN       RR

2.2 显示每种算法下各进程的调度执行顺序。

2.3计算各进程的开始执行时间,各作业的完成时间,周转时间和带权周转时间(周转系数)。

2.4模拟数据结果分析:对同一组模拟数据,比较各算法的平均周转时间,周转系数。

三、实验说明

1)  先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。

2)  短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。

3)  响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间。

4)  时间片轮转(RR)调度算法:调度程序每次把CPU分配给就绪队列首进程使用一个时间片,就绪队列中的每个进程轮流地运行一个时间片。当这个时间片结束时,强迫一个进程让出处理器,让它排列到就绪队列的尾部,等候下一轮调度。

四、实验环境

可以选用Turbo C作为开发环境。也可以选用Windows下的VB,CB等可视化环境,利用各种控件较为方便。自主选择实验环境。

五、程序代码

  1. #include"stdio.h"
  2. #define bool char
  3. #define true 1
  4. #define false 0
  5. #define N 50
  6. int n;
  7. int sj;
  8. typedef struct gzuo{
  9. int id; //进程名字
  10. int dt; //到达时刻
  11. int st; //服务时间
  12. int wct; //完成时刻
  13. int yxj; //优先级
  14. int st2; //标志是否完成
  15. float zt; //周转时间
  16. float dczt; //带权周转时间
  17. }Gzuo;
  18. Gzuo a[N];
  19. void input(Gzuo a[])
  20. {
  21. int i;
  22. printf("请输入进程个数:");
  23. scanf("%d",&n);
  24. for(i=0;i<n;i++)
  25. {
  26. a[i].id=i+1;
  27. printf("\t到达时间: ");
  28. scanf("%d",&a[i].dt);
  29. printf("\t服务时间:");
  30. scanf("%d",&a[i].st);
  31. a[i].st2 = a[i].st;
  32. printf("\n");
  33. }
  34. printf("\t请输入时间片大小(0<sjp):\t");
  35. scanf("%d",&sj);
  36. }
  37. void sjp(Gzuo a[],int sj)//时间片轮转调度
  38. {
  39. int i,j,min,time;
  40. float sum1,sum2;
  41. bool flag=true;
  42. for(j=n-1;j>=0;j--)
  43. {
  44. for(i=0;i<j;i++)
  45. {
  46. if(a[i].dt>a[i+1].dt)
  47. {
  48. min=a[i].dt;
  49. a[i].dt=a[i+1].dt;
  50. a[i+1].dt=min;
  51. min=a[i].st;
  52. a[i].st=a[i+1].st;
  53. a[i+1].st=min;
  54. min=a[i].st2;
  55. a[i].st2=a[i+1].st2;
  56. a[i+1].st2=min;
  57. min=a[i].id;
  58. a[i].id=a[i+1].id;
  59. a[i+1].id=min;
  60. }
  61. }
  62. }
  63. time = a[0].dt;
  64. min = 0;
  65. while(min<n)
  66. {
  67. flag=true;
  68. for(i=0;i<n;i++)
  69. {
  70. if(a[i].st2>0&&a[i].dt<=time)
  71. flag=false;
  72. }
  73. for(i=0;i<n;i++)
  74. {
  75. if(a[i].st2 > 0 )
  76. {
  77. if(a[i].dt<=time)
  78. {
  79. a[i].st2 = a[i].st2 - sj;
  80. time = time + sj;
  81. if(a[i].st2<=0)
  82. {
  83. a[i].wct = time + a[i].st2;
  84. a[i].zt=(float)(a[i].wct-a[i].dt);
  85. a[i].dczt=a[i].zt/a[i].st;
  86. min++;
  87. }
  88. }else if(flag)
  89. {
  90. for(i=0;i<n;i++)
  91. {
  92. if(a[i].st2>0&&a[i].dt>time)
  93. {
  94. time = a[i].dt;
  95. break;
  96. }
  97. }
  98. }
  99. }
  100. }
  101. }
  102. printf("\n进程:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
  103. sum1=0;
  104. sum2=0;
  105. for(j=0;j<n;j++)
  106. {
  107. for(i=0;i<n;i++)
  108. if(a[i].id==j+1)
  109. {
  110. printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
  111. sum1+=a[i].zt;
  112. sum2+=a[i].dczt;
  113. }
  114. }
  115. printf("*********************************************************************\n");
  116. }
  117. void fcfs(Gzuo a[])//先到先服务调度
  118. {
  119. int i,j,min;
  120. float sum1,sum2;
  121. for(j=n-1;j>=0;j--)
  122. {
  123. for(i=0;i<j;i++)
  124. {
  125. if(a[i].dt>a[i+1].dt)
  126. {
  127. min=a[i].dt;
  128. a[i].dt=a[i+1].dt;
  129. a[i+1].dt=min;
  130. min=a[i].st;
  131. a[i].st=a[i+1].st;
  132. a[i+1].st=min;
  133. min=a[i].id;
  134. a[i].id=a[i+1].id;
  135. a[i+1].id=min;
  136. }
  137. }
  138. }
  139. a[0].wct=a[0].st+a[0].dt;
  140. a[0].zt=(float)a[0].st;
  141. a[0].dczt=a[0].zt/a[0].st;
  142. for(i=1;i<n;i++)
  143. {
  144. if(a[i].dt>a[i-1].wct)
  145. {
  146. a[i].wct=a[i].dt+a[i].st;
  147. a[i].zt=(float)a[i].st;
  148. a[i].dczt=a[i].zt/a[i].st;
  149. }
  150. else
  151. {
  152. a[i].wct=a[i-1].wct+a[i].st;
  153. a[i].zt=(float)(a[i].wct-a[i].dt);
  154. a[i].dczt=a[i].zt/a[i].st;
  155. }
  156. }
  157. printf("\n进程:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
  158. sum1=0;
  159. sum2=0;
  160. for(j=0;j<n;j++)
  161. {
  162. for(i=0;i<n;i++)
  163. if(a[i].id==j+1)
  164. {
  165. printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
  166. sum1+=a[i].zt;
  167. sum2+=a[i].dczt;
  168. }
  169. }
  170. printf("*********************************************************************\n");
  171. }
  172. void sjf(Gzuo a[])//短作业优先调度
  173. {
  174. int i,j,min;
  175. int b=0,z;
  176. float sum1,sum2;
  177. min=a[0].dt;
  178. for(j=n-1;j>=0;j--)
  179. {
  180. for(i=0;i<j;i++)
  181. {
  182. if(a[i].dt>a[i+1].dt)
  183. {
  184. min=a[i].dt;
  185. a[i].dt=a[i+1].dt;
  186. a[i+1].dt=min;
  187. min=a[i].st;
  188. a[i].st=a[i+1].st;
  189. a[i+1].st=min;
  190. min=a[i].id;
  191. a[i].id=a[i+1].id;
  192. a[i+1].id=min;
  193. }
  194. if(a[i].dt==a[i+1].dt&&a[i].st>a[i+1].st)
  195. {
  196. min=a[i].dt;
  197. a[i].dt=a[i+1].dt;
  198. a[i+1].dt=min;
  199. min=a[i].st;
  200. a[i].st=a[i+1].st;
  201. a[i+1].st=min;
  202. min=a[i].id;
  203. a[i].id=a[i+1].id;
  204. a[i+1].id=min;
  205. }
  206. }
  207. }
  208. a[0].wct=a[0].st+a[0].dt;
  209. a[0].zt=(float)a[0].st;
  210. a[0].dczt=a[0].zt/a[0].st;
  211. for(i=1;i<n;i++)
  212. {
  213. if(a[i].dt>a[0].wct);
  214. else
  215. b=b+1;
  216. }
  217. for(j=b-1;j>=1;j--)
  218. {
  219. for(i=1;i<j;i++)
  220. {
  221. if(a[i].st>a[i+1].st)
  222. {
  223. min=a[i].dt;
  224. a[i].dt=a[i+1].dt;
  225. a[i+1].dt=min;
  226. min=a[i].st;
  227. a[i].st=a[i+1].st;
  228. a[i+1].st=min;
  229. min=a[i].id;
  230. a[i].id=a[i+1].id;
  231. a[i+1].id=min;
  232. }
  233. }
  234. }
  235. for(i=1;i<n;i++)
  236. {
  237. if(a[i].dt>a[i-1].wct)
  238. {
  239. a[i].wct=a[i].dt+a[i].st;
  240. a[i].zt=(float)a[i].st;
  241. a[i].dczt=a[i].zt/a[i].st;
  242. }
  243. else
  244. {
  245. a[i].wct=a[i-1].wct+a[i].st;
  246. a[i].zt=(float)(a[i].wct-a[i].dt);
  247. a[i].dczt=a[i].zt/a[i].st;
  248. }
  249. for(j=i+1,b=j;j<n;j++)
  250. {
  251. if(a[j].dt>a[i].wct);
  252. else
  253. b=b+1;
  254. }
  255. for(j=b-1;j>=i;j--)
  256. {
  257. for(z=i;z<j;z++)
  258. {
  259. if(a[z].st>a[z+1].st)
  260. {
  261. min=a[z].dt;
  262. a[z].dt=a[z+1].dt;
  263. a[z+1].dt=min;
  264. min=a[z].st;
  265. a[z].st=a[z+1].st;
  266. a[z+1].st=min;
  267. min=a[i].id;
  268. a[i].id=a[i+1].id;
  269. a[i+1].id=min;
  270. }
  271. }
  272. }
  273. }
  274. printf("\n进程:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");
  275. sum1=0;
  276. sum2=0;
  277. for(j=0;j<n;j++)
  278. {
  279. for(i=0;i<n;i++)
  280. if(a[i].id==j+1)
  281. {
  282. printf("%d: %d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
  283. sum1+=a[i].zt;
  284. sum2+=a[i].dczt;
  285. }
  286. }
  287. printf("**************************************************************************\n");
  288. }
  289. void yxj(Gzuo a[])//优先级优先调度
  290. {
  291. int i,j,min;
  292. int b=0,z;
  293. float sum1,sum2;
  294. min=a[0].dt;
  295. for(j=n-1;j>=0;j--)
  296. {
  297. for(i=0;i<j;i++)
  298. {
  299. if(a[i].dt>a[i+1].dt)
  300. {
  301. min=a[i].dt;
  302. a[i].dt=a[i+1].dt;
  303. a[i+1].dt=min;
  304. min=a[i].st;
  305. a[i].st=a[i+1].st;
  306. a[i+1].st=min;
  307. min=a[i].id;
  308. a[i].id=a[i+1].id;
  309. a[i+1].id=min;
  310. min=a[i].yxj;
  311. a[i].yxj=a[i+1].yxj;
  312. a[i+1].yxj=min;
  313. }
  314. if(a[i].dt==a[i+1].dt&&a[i].yxj<a[i+1].yxj)
  315. {
  316. min=a[i].dt;
  317. a[i].dt=a[i+1].dt;
  318. a[i+1].dt=min;
  319. min=a[i].st;
  320. a[i].st=a[i+1].st;
  321. a[i+1].st=min;
  322. min=a[i].id;
  323. a[i].id=a[i+1].id;
  324. a[i+1].id=min;
  325. min=a[i].yxj;
  326. a[i].yxj=a[i+1].yxj;
  327. a[i+1].yxj=min;
  328. }
  329. }
  330. }
  331. a[0].wct=a[0].st+a[0].dt;
  332. a[0].zt=(float)a[0].st;
  333. a[0].dczt=a[0].zt/a[0].st;
  334. for(i=1;i<n;i++)
  335. {
  336. if(a[i].dt>a[0].wct);
  337. else b++;
  338. }
  339. for(j=b-1;j>=1;j--)
  340. {
  341. for(i=1;i<j;i++)
  342. {
  343. if(a[i].yxj<a[i+1].yxj) {
  344. min=a[i].dt;
  345. a[i].dt=a[i+1].dt;
  346. a[i+1].dt=min;
  347. min=a[i].st;
  348. a[i].st=a[i+1].st;
  349. a[i+1].st=min;
  350. min=a[i].id;
  351. a[i].id=a[i+1].id;
  352. a[i+1].id=min;
  353. min=a[i].yxj;
  354. a[i].yxj=a[i+1].yxj;
  355. a[i+1].yxj=min;
  356. }
  357. if(a[i].dt==a[i+1].dt&&a[i].yxj<a[i+1].yxj)
  358. {
  359. min=a[i].dt;
  360. a[i].dt=a[i+1].dt;
  361. a[i+1].dt=min;
  362. min=a[i].st;
  363. a[i].st=a[i+1].st;
  364. a[i+1].st=min;
  365. min=a[i].id;
  366. a[i].id=a[i+1].id;
  367. a[i+1].id=min;
  368. min=a[i].yxj;
  369. a[i].yxj=a[i+1].yxj;
  370. }
  371. }
  372. }
  373. a[0].wct=a[0].st+a[0].dt;
  374. a[0].zt=(float)a[0].st;
  375. a[0].dczt=a[0].zt/a[0].st;
  376. for(i=1;i<n;i++)
  377. {
  378. if(a[i].dt>a[0].wct) ;
  379. else b++;
  380. }
  381. for(j=b-1;j>=1;j--)
  382. {
  383. for(i=1;i<j;i++)
  384. {
  385. if(a[i].yxj<a[i+1].yxj)
  386. {
  387. min=a[i].dt;
  388. a[i].dt=a[i+1].dt;
  389. a[i+1].dt=min;
  390. min=a[i].st;
  391. a[i].st=a[i+1].st;
  392. a[i+1].st=min;
  393. min=a[i].id;
  394. a[i].id=a[i+1].id;
  395. a[i+1].id=min;
  396. min=a[i].yxj;
  397. a[i].yxj=a[i+1].yxj;
  398. a[i+1].yxj=min;
  399. }
  400. }
  401. }
  402. for(i=1;i<n;i++)
  403. {
  404. if(a[i].dt>a[i-1].wct)
  405. {
  406. a[i].wct=a[i].dt+a[i].st;
  407. a[i].zt=(float)a[i].st;
  408. a[i].dczt=a[i].zt/a[i].st;
  409. }
  410. else
  411. {
  412. a[i].wct=a[i-1].wct+a[i].st;
  413. a[i].zt=(float)(a[i].wct-a[i].dt);
  414. a[i].dczt=a[i].zt/a[i].st;
  415. }
  416. for(j=i+1,b=j;j<n;j++)
  417. {
  418. if(a[j].dt>a[i].wct);
  419. else b=b+1;
  420. }
  421. for(j=b-1;j>=i;j--)
  422. {
  423. for(z=i;z<j;z++)
  424. {
  425. if(a[z].yxj<a[z+1].yxj)
  426. {
  427. min=a[z].dt;
  428. a[z].dt=a[z+1].dt;
  429. a[z+1].dt=min;
  430. min=a[z].st;
  431. a[z].st=a[z+1].st;
  432. a[z+1].st=min;
  433. min=a[i].id;
  434. a[i].id=a[i+1].id;
  435. a[i+1].id=min;
  436. }
  437. }
  438. }
  439. }
  440. printf("\n进程:到达时间\t服务时间\t优先级\t完成时间\t周转时间\t带权周转时间\n");
  441. sum1=0;
  442. sum2=0;
  443. for(j=0;j<n;j++)
  444. {
  445. for(i=0;i<n;i++)
  446. if(a[i].id==j+1)
  447. {
  448. printf("%d:%d\t\t%d\t\t%d\t\t%d\t\t%.0f\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].st,a[i].wct,a[i].zt,a[i].dczt);
  449. sum1+=a[i].zt;
  450. sum2+=a[i].dczt;
  451. }
  452. }
  453. printf("*********************************************************************\n");
  454. }
  455. void main()
  456. {
  457. int n;
  458. input(a);
  459. printf("以下是先到先服务调度:");
  460. fcfs(a);
  461. printf("以下是短作业优先调度:");
  462. sjf(a);
  463. printf("以下是时间片轮转法:");
  464. sjp(a,sj);
  465. printf("以下是优先级优先调度:");
  466. yxj(a);
  467. }

六、程序结果