您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 短作业优先调度和时间片轮转调度算法
电子科技大学实验报告学生姓名:胡钟文学号:2823103010指导教师:罗惠琼一、实验室名称:主楼A2-412二、实验项目名称:进程调度算法的设计三、实验原理:短作业(进程)优先调度算法:短作业调度算法是从后备队列中选择一个或者若干个估计运行时间最短的作业,将他们调入内存运行。而短进程优先调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或者发生某事件而被阻塞放弃处理机时再重新调度。时间片轮转法:系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的队尾;然后,再把处理机分配给就绪队列中的新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一个给定的时间内均能获得一时间片的处理机执行时间。四、实验目的:通过对进程调度算法的设计,深入理解进程调度的原理五、实验内容:1.编写程序实现SJ(P)F算法2.编写程序实现RR算法六、实验器材(设备、元器件):装有VC++6.0的PC机一台七、实验步骤:1.打开VC,设计编写程序的源代码2.编译运行程序的源代码3.分析检验程序的结果是否正确4.总结实验结果及结论短进程优先调度源代码:#includestdio.hstructsjf{charname[10];floatarrivetime;floatservicetime;floatstarttime;floatfinishtime;floatzztime;floatdqzztime;};sjfa[100];voidinput(sjf*p,intN){inti;printf(intputtheprocess'sname&arrivetime&servicetime:\nforexmple:a0100\n);for(i=0;i=N-1;i++){printf(inputthe%dthprocess'sinformation:\n,i+1);scanf(%s%f%f,&p[i].name,&p[i].arrivetime,&p[i].servicetime);}}voidPrint(sjf*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatdqzztime,intN){intk;printf(runorder:);printf(%s,p[0].name);for(k=1;kN;k++){printf(--%s,p[k].name);}printf(\ntheprocess'sinformation:\n);printf(\nname\tarrive\tservice\tstart\tfinish\tzz\tdqzz\n);for(k=0;k=N-1;k++){printf(%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);}}//排序voidsort(sjf*p,intN){for(inti=0;i=N-1;i++)for(intj=0;j=i;j++)if(p[i].arrivetimep[j].arrivetime){sjftemp;temp=p[i];p[i]=p[j];p[j]=temp;}}//运行阶段voiddeal(sjf*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,float&zztime,float&dqzztime,intN){intk;for(k=0;k=N-1;k++){if(k==0){p[k].starttime=p[k].arrivetime;p[k].finishtime=p[k].arrivetime+p[k].servicetime;}else{p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}}for(k=0;k=N-1;k++){p[k].zztime=p[k].finishtime-p[k].arrivetime;p[k].dqzztime=p[k].zztime/p[k].servicetime;}}voidsjff(sjf*p,intN){floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;//对结构进行初始化sort(p,N);for(intm=0;mN-1;m++){if(m==0)p[m].finishtime=p[m].arrivetime+p[m].servicetime;elsep[m].finishtime=p[m-1].finishtime+p[m].servicetime;inti=0;for(intn=m+1;n=N-1;n++){if(p[n].arrivetime=p[m].finishtime)//判断内存中每次完成之后有多少到达的进程i++;}floatmin=p[m+1].servicetime;intnext=m+1;//m+1=nfor(intk=m+1;km+i;k++)//找出到达后的进程中最小的进程{if(p[k+1].servicetimemin){min=p[k+1].servicetime;next=k+1;}}sjftemp;temp=p[m+1];p[m+1]=p[next];p[next]=temp;}deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);}voidmain(){intN;printf(------短作业优先调度算法------\n);printf(inputtheprocess'snumber:\n);scanf(%d,&N);input(a,N);sjf*b=a;sjf*c=a;sjff(b,N);}时间片轮转法源代码:#includestdio.h#defineM5//物理页数#defineMyprintfprintf(|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n)typedefstructPCB{intID;intReachTime;intTotalTime;}PCB;//进程号,到达时间和服务时间typedefstructNOTE//备份{intID;intTotalTime;}NOTE;PCBA[M];//5个进程PCBa[M];NOTEtemp;intqueue[50];//记录调度的进程intK=0;//调度进程数组的标识voidINIT()//初始化{inti;for(i=0;iM;i++){A[i].ID=-1;}}intGetNum()//计算进程数{inti,j=0;for(i=0;iM;i++){if(A[i].ID!=-1){j++;}}returnj;}intGetReach(inttime)//找出到达进程号{inti;for(i=0;iM;i++){if(a[i].ReachTime=time){a[i].ReachTime=100;returni;}}return-1;}intGetInsert()//找出插入位置{inti;for(i=0;iM;i++){if(A[i].ID==-1)returni;}return-1;}voidForward(intnum)//前移{inti;for(i=0;inum-1;i++){A[i].ID=A[i+1].ID;A[i].TotalTime=A[i+1].TotalTime;}A[num-1].ID=-1;}voidProcess()//执行进程{queue[K]=A[0].ID;K++;A[0].TotalTime--;temp.ID=A[0].ID;temp.TotalTime=A[0].TotalTime;}voidmain(){inti;inttime;intt=0;intreach;intinsert;intnum;printf(RR算法\n\n);INIT();for(i=0;iM;i++){printf(请输入进程ID:);scanf(%d,&a[i].ID);printf(请输入到达时间:);scanf(%d,&a[i].ReachTime);printf(请输入服务时间:);scanf(%d,&a[i].TotalTime);}for(i=0;iM;i++)//运行时间{t=t+a[i].TotalTime;}for(i=0;i50;i++)//初始化{queue[i]=-1;}for(time=0;time=t;time++){reach=GetReach(time);if(reach!=-1)//有进程到达{insert=GetInsert();A[insert].ID=a[reach].ID;A[insert].TotalTime=a[reach].TotalTime;num=GetNum();if(num==1)continue;//进程数为1else{//进程数不为1Process();Forward(num);if(temp.TotalTime!=0){A[num-1].ID=temp.ID;A[num-1].TotalTime=temp.TotalTime;}}}else//没有进程到达{num=GetNum();if(num==1){//进程数为1Process();if(temp.TotalTime==0){A[0].ID=-1;}}elseif(num==0)continue;//进程数为0else{Process();Forward(num);if(temp.TotalTime!=0){A[num-1].ID=temp.ID;A[num-1].TotalTime=temp.TotalTime;}}}}printf(\n);printf(调度顺序为:\n);Myprintf;for(i=0;i50;i++){if(queue[i]!=-1)printf(|%2d,queue[i]);}printf(|\n);Myprintf;printf(\n);}八、实验数据及结果分析:短作业优先调度算法的实验结果:时间片轮转调度算法结果:九、实验结论:本次实验成功的完成了短作业优先调度算法和轮转时间片调度算法的模拟,通过本次实验我们了解到短作业优先调度算法不利于长作业的处理,因为长作业将长期得不到处理,而轮转时间片调度算法则解决了这一问题。短长作业均能在每一个周期内分得一个时间片处理自己的任务。十、总结及心得体会:通过本次实验对短作业优先调度算法和时间片轮转调度算法有了更深入的理解,同时,对程序算法能力有了进一步的提高,同时对模块化编程有了更深入得理解,代码的模块化会使程序的代码复用率提高,提高编程的效率。十一、对本实验过程及方法、手段的改进建议:本次实验的时间片轮转调度算法由于教材版本不一样有两种结果,本次实验本人采取的新教材
本文标题:短作业优先调度和时间片轮转调度算法
链接地址:https://www.777doc.com/doc-735542 .html