zoukankan      html  css  js  c++  java
  • 实验三

    一、实验目的

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

    二、实验要求

    设计一个有 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. }

    六、程序结果

  • 相关阅读:
    libmysql.lib 和 mysqlclient.lib的区别
    输入框禁止输入法
    html加后退按钮
    spry
    migration
    Ruby char <=> ASCII
    Javascript innerhtml
    My SQL 索引
    datepicker
    ruby 常用正则表达式
  • 原文地址:https://www.cnblogs.com/liulingyuan/p/5528879.html
Copyright © 2011-2022 走看看