1、先来先服务调度和最短作业优先调度算法实验报告实验概述:【实验目的及要求】理解并掌握处理机调度算法【实验原理】基于先来先服务调度和最短作业优先调度算法思想用C语言编程实现【实验环境】(使用的软件)Visual C+6.0实验内容:本实验模拟在单处理机情况下处理机调度,用C语言编程实现先来先服务和最短作业优先调度算法。【实验方案设计】FCFS流程图:SJF流程图:试验总设计流程图:进程等待时间进程开始运行时间进程提交时间(即进程处于就绪态时间) 进程周转时间进程结束时间进程提交时间【实验过程】(实验步骤、记录、数据、分析)测试用例1:屏幕显示:Please input the total numb
2、er of jobs输入:4 屏幕显示:Please input job number, submit time and run time 输入:1 9.0 0.22 8.5 0.53 8.0 1.04 9.1 0.1屏幕显示:What kind of algorithm do you want? Please input 1 to select FCFS, or 2 to select SJF.输入:3 屏幕显示:You have input a wrong number, please input again.输入:1屏幕输出结果: submit run starting final wa
3、it turnaround3 8.0 1.0 8.0 9.0 0.0 1.02 8.5 0.5 9.0 9.5 0.5 1.01 9.0 0.2 9.5 9.7 0.5 0.74 9.1 0.1 9.7 9.8 0.6 0.7屏幕显示:The average turnaround time is 0.85What kind of algorithm do you want? Please input 1 to select FCFS, or 2 to select SJF, or 0 to exit.测试数据二: submit run 1 6 0.52 5 0.93 6.3 0.1FCFS和S
4、JF算法结果一样:submit run starting final wait turnaround2 5 0.9 5 5.9 0 0.91 6 0.5 6 6.5 0 0.53 6.3 0.1 6.5 6.6 0.2 0.3The average turnaround time is 0.567测试数据三: submit run1 5 0.22 4.2 0.33 5.1 0.34 5.2 0.1FCFS:submit run starting final wait turnaround2 4.2 0.3 4.2 4.5 0 0.31 5 0.2 5 5.2 0 0.23 5.1 0.3 5.
5、2 5.5 0.1 0.44 5.2 0.1 5.5 5.6 0.3 0.4The average turnaround time is 0.325SJF:submit run starting final wait turnaround2 4.2 0.3 4.2 4.5 0 0.31 5 0.2 5 5.2 0 0.24 5.2 0.1 5.2 5.3 0 0.13 5.1 0.3 5.3 5.6 0.2 0.5The average turnaround time is 0.275源程序:#include stdio.h#includestdlib.h#includestring.h#de
6、fine M 50struct sjf int jobnumber; float submittime; float runtime; float starttime; float finishtime; float waittime; float turnaroundtime;temp;static struct sjf stM;void input(struct sjf *p,int N) int i; printf(Please input the job number,submit time and run time:nFor exmple:1 8.5 2.0n); for(i=0;i
7、N;i+) scanf(%d%f%f,&pi.jobnumber,&pi.submittime,&pi.runtime); void print(struct sjf *p,int N) int k; float h,g; printf(run order:); printf(%d,p0.jobnumber); for(k=1;k%d,pk.jobnumber); printf(nThe processs information:n); printf(njobnumtsubmittruntstarttfinaltwaittturnaroundn); for(k=0;kN;k+) h+=pk.t
8、urnaroundtime; printf(%dt%-.1ft%-.1ft%-.1ft%-.1ft%-.1ft%-.1ftn,pk.jobnumber,pk.submittime,pk.runtime,pk.starttime,pk.finishtime,pk.waittime,pk.turnaroundtime); g=h/N; printf(nThe average turnaround time is %-.2fn,g);/*按提交时间从小到大排序*/void sort1(struct sjf *p,int N) int i,j; for(i=0;iN;i+) for(j=0;j=i;j
9、+) if(pi.submittimepj.submittime) temp=pi; pi=pj; pj=temp; /*运行*/void deal(struct sjf *p,int N) int k; for(k=0;kpk-1.finishtime) pk.starttime=pk.submittime; pk.finishtime=pk.submittime+pk.runtime; else pk.starttime=pk-1.finishtime; pk.finishtime=pk-1.finishtime+pk.runtime; for(k=0;kN;k+) pk.turnarou
10、ndtime=pk.finishtime-pk.submittime; pk.waittime=pk.starttime-pk.submittime; void sort2(struct sjf *p,int N) int next,m,n,k,i; float min; sort1(p,N); for(m=0;mpm-1.finishtime) pm.finishtime=pm.submittime+pm.runtime; else pm.finishtime=pm-1.finishtime+pm.runtime; for(n=m+1;nN;n+) if(pn.submittime=pm.f
11、inishtime)/*判断内存中每次完成之后又多少到达的进程*/ i+; min=pm+1.runtime; next=m+1; for(k=m+1;km+i;k+)/*找出到达后的进程中运行时间最小的进程*/ if(pk+1.runtimemin) min=pk+1.runtime; next=k+1; temp=pm+1; pm+1=pnext; pnext=temp; deal(p,N); print(p,N); void main() int N,i; printf(Please input the total number of jobs:); scanf(%d,&N); inpu
12、t(st,N);loop2: printf(What kind of algorithm do you want? Please input 1 to select FCFS, or 2 to select SJF or 0 to exit:);loop: scanf(%d,&i); if(i=0) exit(1); else if(i=1) sort1(st,N); deal(st,N); print(st,N); goto loop2; else if(i=2) sort2(st,N); goto loop2; else printf(You have input a wrong numb
13、er, please input again:); goto loop; 【结论】(结果)测试1:测试二:测试三:【小结】实验中产生的错误及原因分析:测试用例1的结果:错误1:错误解决方式:主要是子函数sort2()中出的错:i的作用域,程序修改:将原来:int next,m,n,k,i=0; float min; sort1(p,N); for(m=0;mN;m+) 改为:int next,m,n,k,i; float min; sort1(p,N); for(m=0;mpm-1.finishtime) pm.finishtime=pm.submittime+pm.runtime; else
14、 pm.finishtime=pm-1.finishtime+pm.runtime; 测试用例3的结果:错误1:错误分析:同2 一样,未在子函数sort()中未考虑到“提交时间(submittime)大于上个进程的结束时间”的情况:解决方法:将原来的: else pm.finishtime=pm-1.finishtime+pm.runtime;修改为:else if(pm.submittimepm-1.finishtime) pm.finishtime=pm.submittime+pm.runtime; else pm.finishtime=pm-1.finishtime+pm.runtime
15、; 实验的体会及收获:通过这次试验,我对处理机的调度算法特别是FCFS和SJF有了更深的理解,而且锻炼了我的思维能力,使我能更全面地思考问题,以后还需要多做些这方面的练习。试验不足之处:试验未考虑同一时间提交多个进程的情况,如:测试数据: submit run1 7 0.22 7.2 0.53 7 0.1结果应该是:FCFS:submit run start final wait turnaround1 7 0.2 7.0 7.5 0.0 0.53 7 0.1 7.5 7.6 0.5 0.62 7.2 0.5 7.6 7.8 0.4 0.6The average turnaround time
16、 is 0.57.SJF:Jobnum submit run starting final wait turnaround3 7 0.1 7.0 7.1 0.0 0.11 7 0.5 7.1 7.6 0.1 0.62 7.2 0.2 7.6 7.8 0.6 0.6The average turnaround time is 0.43.而程序运行结果是:程序结果表明该程序还是存在不足之处的。这是需要继续改进的地方。指导教师评语及成绩:评语:成绩: 指导教师签名: 批阅日期:实验报告说明 1实验项目名称:要用最简练的语言反映实验的内容。要求与实验指导书中相一致。2实验类型:一般需说明是验证型实验还
17、是设计型实验,是创新型实验还是综合型实验。3实验目的与要求:目的要明确,要抓住重点,符合实验指导书中的要求。4实验原理:简要说明本实验项目所涉及的理论知识。5实验环境:实验用的软硬件环境(配置)。6实验方案设计(思路、步骤和方法等):这是实验报告极其重要的内容。概括整个实验过程。对于操作型实验,要写明依据何种原理、操作方法进行实验,要写明需要经过哪几个步骤来实现其操作。对于设计型和综合型实验,在上述内容基础上还应该画出流程图、设计思路和设计方法,再配以相应的文字说明。对于创新型实验,还应注明其创新点、特色。7实验过程(实验中涉及的记录、数据、分析):写明具体上述实验方案的具体实施,包括实验过程中的记录、数据和相应的分析。8结论(结果):即根据实验过程中所见到的现象和测得的数据,做出结论。9小结:对本次实验的心得体会、思考和建议。10指导教师评语及成绩:指导教师依据学生的实际报告内容,用简练语言给出本次实验报告的评价和价值。注意: 实验报告将记入实验成绩; 每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1