《短作业优先调度和时间片轮转调度算法.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.TotalTime=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;i50;i+)(if(queuei!=-l)printf(%2d