先来先服务调度和最短作业优先调度算法实验报告.docx
- 文档编号:12718893
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:14
- 大小:48.75KB
先来先服务调度和最短作业优先调度算法实验报告.docx
《先来先服务调度和最短作业优先调度算法实验报告.docx》由会员分享,可在线阅读,更多相关《先来先服务调度和最短作业优先调度算法实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
先来先服务调度和最短作业优先调度算法实验报告
实验概述:
【实验目的及要求】
理解并掌握处理机调度算法
【实验原理】
基于先来先服务调度和最短作业优先调度算法思想用C语言编程实现
【实验环境】(使用的软件)
VisualC++6.0
实验内容:
本实验模拟在单处理机情况下处理机调度,用C语言编程实现先来先服务和最短作业优先调度算法。
【实验方案设计】
FCFS流程图:
SJF流程图:
试验总设计流程图:
进程等待时间=进程开始运行时间-进程提交时间(即进程处于就绪态时间)
进程周转时间=进程结束时间-进程提交时间
【实验过程】(实验步骤、记录、数据、分析)
测试用例1:
屏幕显示:
Pleaseinputthetotalnumberofjobs
输入:
4<回车>
屏幕显示:
Pleaseinputjobnumber,submittimeandruntime
输入:
19.00.2<回车>
28.50.5<回车>
38.01.0<回车>
49.10.1<回车>
屏幕显示:
Whatkindofalgorithmdoyouwant?
Pleaseinput1toselectFCFS,or2toselectSJF.
输入:
3<回车>
屏幕显示:
Youhaveinputawrongnumber,pleaseinputagain.
输入:
1<回车>
屏幕输出结果:
submitrunstartingfinalwaitturnaround
38.01.08.09.00.01.0
28.50.59.09.50.51.0
19.00.29.59.70.50.7
49.10.19.79.80.60.7
屏幕显示:
Theaverageturnaroundtimeis0.85
Whatkindofalgorithmdoyouwant?
Pleaseinput1toselectFCFS,or2toselectSJF,or0toexit.
测试数据二:
submitrun
160.5
250.9
36.30.1
FCFS和SJF算法结果一样:
submitrunstartingfinalwaitturnaround
250.955.900.9
160.566.500.5
36.30.16.56.60.20.3
Theaverageturnaroundtimeis0.567
测试数据三:
submitrun
150.2
24.20.3
35.10.3
45.20.1
FCFS:
submitrunstartingfinalwaitturnaround
24.20.34.24.500.3
150.255.200.2
35.10.35.25.50.10.4
45.20.15.55.60.30.4
Theaverageturnaroundtimeis0.325
SJF:
submitrunstartingfinalwaitturnaround
24.20.34.24.500.3
150.255.200.2
45.20.15.25.300.1
35.10.35.35.60.20.5
Theaverageturnaroundtimeis0.275
源程序:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#defineM50
structsjf{
intjobnumber;
floatsubmittime;
floatruntime;
floatstarttime;
floatfinishtime;
floatwaittime;
floatturnaroundtime;
}temp;
staticstructsjfst[M];
voidinput(structsjf*p,intN)
{
inti;
printf("Pleaseinputthejobnumber,submittimeandruntime:
\nForexmple:
18.52.0\n");
for(i=0;i { scanf("%d%f%f",&p[i].jobnumber,&p[i].submittime,&p[i].runtime); } } voidprint(structsjf*p,intN) { intk; floath,g; printf("runorder: "); printf("%d",p[0].jobnumber); for(k=1;k printf("-->%d",p[k].jobnumber); printf("\nTheprocess'sinformation: \n"); printf("\njobnum\tsubmit\trun\tstart\tfinal\twait\tturnaround\n"); for(k=0;k { h+=p[k].turnaroundtime; printf("%d\t%-.1f\t%-.1f\t%-.1f\t%-.1f\t%-.1f\t%-.1f\t\n",p[k].jobnumber,p[k].submittime,p[k].runtime,p[k].starttime,p[k].finishtime,p[k].waittime,p[k].turnaroundtime); } g=h/N; printf("\nTheaverageturnaroundtimeis%-.2f\n",g); } /*按提交时间从小到大排序*/ voidsort1(structsjf*p,intN) { inti,j; for(i=0;i for(j=0;j<=i;j++) if(p[i].submittime { temp=p[i]; p[i]=p[j]; p[j]=temp; } } /*运行*/ voiddeal(structsjf*p,intN) { intk; for(k=0;k { if(k==0) { p[k].starttime=p[k].submittime; p[k].finishtime=p[k].submittime+p[k].runtime; } else { if(p[k].submittime>p[k-1].finishtime) { p[k].starttime=p[k].submittime; p[k].finishtime=p[k].submittime+p[k].runtime; } else { p[k].starttime=p[k-1].finishtime; p[k].finishtime=p[k-1].finishtime+p[k].runtime; } } } for(k=0;k { p[k].turnaroundtime=p[k].finishtime-p[k].submittime; p[k].waittime=p[k].starttime-p[k].submittime; } } voidsort2(structsjf*p,intN) { intnext,m,n,k,i; floatmin; sort1(p,N); for(m=0;m { i=0; if(m==0) p[m].finishtime=p[m].submittime+p[m].runtime; else { if(p[m].submittime>p[m-1].finishtime) { p[m].finishtime=p[m].submittime+p[m].runtime; } else p[m].finishtime=p[m-1].finishtime+p[m].runtime; } for(n=m+1;n { if(p[n].submittime<=p[m].finishtime)/*判断内存中每次完成之后又多少到达的进程*/ i++; } min=p[m+1].runtime; next=m+1; for(k=m+1;k { if(p[k+1].runtime { min=p[k+1].runtime; next=k+1; } } temp=p[m+1]; p[m+1]=p[next]; p[next]=temp; } deal(p,N); print(p,N); } voidmain() { intN,i; printf("Pleaseinputthetotalnumberofjobs: "); scanf("%d",&N); input(st,N); loop2: printf("Whatkindofalgorithmdoyouwant? Pleaseinput1toselectFCFS,or2toselectSJFor0toexit: "); loop: scanf("%d",&i); if(i==0) exit (1); elseif(i==1) { sort1(st,N); deal(st,N); print(st,N); gotoloop2; } elseif(i==2) { sort2(st,N); gotoloop2; } else { printf("Youhaveinputawrongnumber,pleaseinputagain: "); gotoloop; } } 【结论】(结果) 测试1: 测试二: 测试三: 【小结】 实验中产生的错误及原因分析: 测试用例1的结果: 错误1: 错误解决方式: 主要是子函数sort2()中出的错: i的作用域,程序修改: 将原来: intnext,m,n,k,i=0; floatmin; sort1(p,N); for(m=0;m { 改为: intnext,m,n,k,i; floatmin; sort1(p,N); for(m=0;m { i=0; 测试用例2的结果: 错误1: 错误原因: 未考虑到“提交时间(submittime)大于上个进程的结束时间”的情况: 解决方法: 将原来的: else { p[m].finishtime=p[m-1].finishtime+p[m].runtime; } 修改为: else { if(p[m].submittime>p[m-1].finishtime) { p[m].finishtime=p[m].submittime+p[m].runtime; } else p[m].finishtime=p[m-1].finishtime+p[m].runtime; } 测试用例3的结果: 错误1: 错误分析: 同2一样,未在子函数sort()中未考虑到“提交时间(submittime)大于上个进程的结束时间”的情况: 解决方法: 将原来的: else p[m].finishtime=p[m-1].finishtime+p[m].runtime; 修改为: else { if(p[m].submittime>p[m-1].finishtime) { p[m].finishtime=p[m].submittime+p[m].runtime; } else p[m].finishtime=p[m-1].finishtime+p[m].runtime; } 实验的体会及收获: 通过这次试验,我对处理机的调度算法特别是FCFS和SJF有了更深的理解,而且锻炼了我的思维能力, 使我能更全面地思考问题,以后还需要多做些这方面的练习。 试验不足之处: 试验未考虑同一时间提交多个进程的情况,如: 测试数据: submitrun 170.2 27.20.5 370.1 结果应该是: FCFS: submitrunstartfinalwaitturnaround 170.27.07.50.00.5 370.17.57.60.50.6 27.20.57.67.80.40.6 Theaverageturnaroundtimeis0.57. SJF: Jobnumsubmitrunstartingfinalwaitturnaround 370.17.07.10.00.1 170.57.17.60.10.6 27.20.27.67.80.60.6 Theaverageturnaroundtimeis0.43. 而程序运行结果是: 程序结果表明该程序还是存在不足之处的。 这是需要继续改进的地方。 指导教师评语及成绩: 评语: 成绩: 指导教师签名: 批阅日期: 实验报告说明 1.实验项目名称: 要用最简练的语言反映实验的内容。 要求与实验指导书中相一致。 2.实验类型: 一般需说明是验证型实验还是设计型实验,是创新型实验还是综合型实验。 3.实验目的与要求: 目的要明确,要抓住重点,符合实验指导书中的要求。 4.实验原理: 简要说明本实验项目所涉及的理论知识。 5.实验环境: 实验用的软硬件环境(配置)。 6.实验方案设计(思路、步骤和方法等): 这是实验报告极其重要的内容。 概括整个实验过程。 对于操作型实验,要写明依据何种原理、操作方法进行实验,要写明需要经过哪几个步骤来实现其操作。 对于设计型和综合型实验,在上述内容基础上还应该画出流程图、设计思路和设计方法,再配以相应的文字说明。 对于创新型实验,还应注明其创新点、特色。 7.实验过程(实验中涉及的记录、数据、分析): 写明具体上述实验方案的具体实施,包括实验过程中的记录、数据和相应的分析。 8.结论(结果): 即根据实验过程中所见到的现象和测得的数据,做出结论。 9.小结: 对本次实验的心得体会、思考和建议。 10.指导教师评语及成绩: 指导教师依据学生的实际报告内容,用简练语言给出本次实验报告的评价和价值。 注意: 实验报告将记入实验成绩; 每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 先来先 服务 调度 作业 优先 算法 实验 报告