《短作业优先调度和时间片轮转调度算法.docx》由会员分享,可在线阅读,更多相关《短作业优先调度和时间片轮转调度算法.docx(10页珍藏版)》请在课桌文档上搜索。
1、实验报告同学姓名:学号:指导老师:一、试验室名称:二、试验项目名称:进程调度算法的设计三、试验原理:短作业(进程)优先调度算法:短作业调度算法是从后备队列中选择一个或者若干个估量运行时间最短的作业,将他们调入内存运行。而短进程优先调度算法则是从就绪队列中选出一个估量运行时间最短的进程,将处理机安排给它,使它马上执行并始终执行到完成,或者发生某大事而被堵塞放弃处理机时再重新调度。时间片轮转法:系统将全部的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU安排给队首进程,并令其执行一个时间片。当执行的时间片用完时,由一个计时器发出时钟中断恳求,调度程序便据此信号来停止该进程的执行,并将它
2、送往就绪队列的队尾;然后,再把处理机安排给就绪队列中的新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的全部进程在一个给定的时间内均能获得一时间片的处理机执行时间。四、试验目的:通过对进程调度算法的设计,深化理解进程调度的原理五、试验内容:1 .编写程序实现SJ(P)F算法2 .编写程序实现RR算法六、试验器材(设施、元器件):装有VC+6.0的PC机一台七、试验步骤:1 .打开VC设计编写程序的源代码2 .编译运行程序的源代码3 .分析检验程序的结果是否正确4 .总结试验结果及结论短进程优先调度源代码:#include,stdio.hstructsjfcharname10J;
3、floatarrivetime;floatservicetime;floatstarttime;floatfinishtime;floatzztime;floatdqzztime;);sjfa100;voidinput(sjf*p,intN)inti;printf(,intputtheprocess,sname&arrivetime&servicetime:nforexmple:a0100n,);for(i=O;i=N-l;i+)(printf(,inputthe%dthprocesssinformation:n,i+1);scanf(H%s%f%f&pi.name,&pi.arrivetim
4、e,&pi.servicetime);)voidPrint(sjf*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatdqzztime,intN)(intk;printf(runorder:);printf(%s,pO.name);for(k=l;k%s,pk.name);)printf(ntheprocesssinfbrmationn);printf(,nnametarrivetservicetstarttfinishtzztdqzzn,);for(k=0;k=N-l;k+)p
5、rintf(,%st%-.2ft%-.2ft%-.2ft%-.2ft%-.2ft%-.2ftn,pk.name,pk.arrivetime,pk.servicetime,pk.starttime,pk.finishtime,pk.zztime,pk.dqzztime);)/排序voidsort(sjf*p,intN)for(inti=0;i=N-l;i+)for(intj=O;j=i;j+)if(pi.arrivetime=pU;jj=temp;)运行阶段voiddeal(sjf*p,floatarrivetime,floatservicetime,floatStarttime,floatfi
6、nishtime,float&zztime,float&dqzztime,intN)intk;for(k=O;k=N-l;k+)(if(k=0)(pkj.starttime=pk.arrivetime;pk.finishtime=pkj.arrivetime+pk.servicetime;)else(pkj.starttime=pk-lJ.finishtime;pk.finishtime=pk-1.finishtime+pk.servicetime;)for(k=0;k=N-l;k+)(pk.zztime=pk.finishtime-pk.arrivetime;pk.dqzztime=pk.z
7、ztimepk.servicetime;voidsjff(sjf*p,intN)floatarrivetime=O,Servicetime=O,Starttime=O,finishtime=O,zztime=0,dqzztime=OX结构进行初始化sort(p,N);for(intm=0;mN-1;m+)if(m=0)plm.finishtime=plm.arrivetime+pmj.servicetiine;elsepm.finishtime=plm-l.finishtime+pm.servicetime;inti=0;fbr(intn=m+l;n=N-l;n+)if(pn.arriveti
8、me=pm.finishtime)推断内存中每次完成之后有多少到达的进程i+;)floatmin=pm+1.servicetime;intnext=m1;/m+1=nfor(intk=m+l;km+i;k+)找出到达后的进程中最小的进程(if(pk+1.servicetimemin)(min=pk+1.servicetime;next=k+l;)syftemp;temp=pm+l;pm+l=pnextj;pnext=temp;)deal(p,arrivetime,servicetime,starttime,Hnishtime,zztime,dqzztime,N);Print(p,arrivet
9、ime,servicetime,Starttime,finishtime,zztime,dqzztime,N);)voidmain()intN;Prirnf(一短作业优先调度算法-一一n,);printf(inputtheprocesssnumben);scanf(%dN);input(a,N);sjf*b=a;syf*c=a;SjfT(b,N);)时间片轮转法源代码:#include#defineM5物理页数#defineMyprintfprintf(,-n,)typedefstructPCB(intID;intReachTime;intTotalTime;PCB;进程号,到达时间和服务时间
10、typedefstructNOTE备份intID;intTotalTime;N0TE;PCBAM;5个进程PCBaM;NOTEtemp;intqueue50;纪录调度的进程intK=O;调度进程数组的标识voidINlT()初始化(inti;for(i=0;iM;i+)(Ai.ID=-l;)intGetNUm()计算进程数(intiJ=O;fbr(i=O;iM;i+)(if(Ai.lD!=-l)(j+;1)returnj;)intGetReach(inttime)找出到达进程号(inti;for(i=0;iM;i+)(if(ai.ReachTime=time)(aij.ReachTime=10
11、0;returni;1Ireturn-1;intGetlnSert()找出插入位置inti;for(i=O;iM;i+)(if(Ai.lD=-l)returni;1return-1;)voidForward(intnum)前移(inti;fdr(i=O;inum-1;i+)(Ai.ID=Ai+l.lD;Ai.TotalTime=Ai+1.TotalTime;)Anum-1.ID=-I;)voidProCeSS()执行进程(queueK=AO.ID;K+;A0.TotalTime-;temp.ID=AO.ID;temp.TotalTime=A0.TotalTime;)voidmain()(int
12、i;inttime;intt=0;intreach;intinsert;intnum;printf(RR算法nn);INIT();fdr(i=O;iM;i+)(Printf(请输入进程ID:);scanf(,%dai.lD);Printf(”请输入到达时间:);scanf(,%d,feai.ReachTime);Printf(请输入服务时间:);scanf(,r%d,ai.TotalTime);for(i=0;iM;i+)运行时间t=t+ai.TotalTime;for(i=0;i50;i+)初始化queuei=-l;for(time=O;time=t;time+)reach=GetReach
13、(time);if(reach!=-l)进程到达insert=GetInsert();Ainsert.ID=areachJ.ID;AinsertJ.TotalTime=areach.TotalTime;num=GetNum();if(nutn=l)COntinue;进程数为1else进程数不为1Process();Forward(num);if(temp.TotalTime!=0)(Anum-l.ID=temp.lD;Anum-1J.lbtalTime=temp.TotalTime;else/没有进程到达num=GetNum();if(num=l)进程数为IProcessO;if(temp.T
14、otalTime=0)AO.ID=-1;elseif(num=O)Continue;进程数为0else(Process();Forward(nun);if(temp.TotalTime!=0)(Anum-1.ID=temp.ID;Anum-l.TotalTime=temp.TotalTime;printf(,n);Printf(调度挨次为:n);Myprintf;fbr(i=0;inDDDDjpDfpIBBIBBIBBIBDuIBB程达露达籥达3达簧达务入入入入入入入入入入入入入入入-WR.邳.H.W.3,中调度顺序为:IPi*essHnykeytoCOntinue九、试验结论:本次试验胜利的
15、完成了短作业优先调度算法和轮转时间片调度算法的模拟,通过本次试验我们了解到短作业优先调度算法不利于长作业的处理,由于长作业将长期得不处处理,而轮转时间片调度算法则解决了这一问题。短长作业均能在每一个周期内分得一个时间片处理自己的任务。十、总结及心得体会:通过本次试验对短作业优先调度算法和时间片轮转调度算法有了更深化的理解,同时,对程序算法力量有了进一步的提高,同时对模块化编程有了更深化得理解,代码的模块化会使程序的代码复用率提高,提高编程的效率。十一、对本试验过程及方法、手段的改进建议:本次试验的时间片轮转调度算法由于教材版本不一样有两种结果,本次试验本人实行的新教材的版本,新版本的难度较老教材要大许多,试验时候可以依据详细状况选择一个适合自己的来做。报告评分:指导老师签字: