您好,欢迎访问三七文档
实验五:进程调度一、实验目的1、理解进程调度的过程。2、掌握各种进程调度算法的实现方法3、通过实验比较各种进程调度算法的优劣。进程调度算法是系统管理进程调度,提高系统性能的重要手段。通过本次实验理解进程调度的机制,在模拟实现先来先服务FCFS、轮转RR(q=1)、最短进程优先SPN、最短剩余时间SRT、最高响应比优先HRRN算法的基础上,比较各种进程调度算法的效率和优劣,从而了解系统进程调度的实现过程。二、实验内容随机给出一个进程调度实例,如:进程到达时间服务时间A03B26C44D65E82模拟进程调度,给出按照算法先来先服务FCFS、轮转RR(q=1)、最短进程优先SPN、最短剩余时间SRT、最高响应比优先HRRN进行调度各进程的完成时间、周转时间、响应比的值。三、实验环境PC+LinuxRedHat操作系统GCC四、实验原理及实验思路1、FCFS先来先服务也可以称为是FIFO先进先出。此策略是当前正在运行的进程停止执行时,选择在就绪队列中存在时间最长的进程运行。这种策略执行长进程比执行短进程更好。2、轮转这种策略是以一个周期性间隔产生时钟中断,当中断发生时,当前正在运行的进程被置于就绪队列中,然后基于FCFS策略选择下一个就绪作业运行,目的是为了减少在FCFS策略下短作业的不利情况。3、SPN最短进程优先这种策略是下一次选择所需处理时间最短的进程。是非抢占策略,目的也是为减少FCFS策略对长进程的偏向。4、SRT最短剩余时间这种策略下调度器总是选择预期剩余时间最短的进程。是抢占策略。5、HRRN最高响应比优先当当前进程完成或被阻塞时,选择响应比R最大的就绪进程,R=(w+s)/s其中w:等待处理器的时间,s:期待的服务时间。这样长进程被饿死的可能性下降。五、流程图随机给出一个进程调度实例(或输入一个进程调度实例)是否有新进程到达初始化开始时间使用进程调度算法进行调度是时间片加1是否所有进程都已在调度中否是记录进程完成时间,周转时间判断进程调度是否结束加入新进程否输出所有进程的完成时间,周转时间,响应比是结束开始六、源代码#includestdio.h#includemath.hvoidFCFS(floatAtime[],floatStime[]);voidSJF(floatAtime[],floatStime[]);voidRR(floatAtime[],floatStime[]);voidHRN(floatAtime[],floatStime[]);main(){charc;inti;floatAtime[5]={0,2,4,6,8};floatStime[5]={3,6,4,5,2};for(i=0;i5;i++)printf(%5.2f,Atime[i]);printf(\n);for(i=0;i5;i++)printf(%5.2f,Stime[i]);printf(\n);scanf(%c,&c);switch(c){case'F':FCFS(Atime,Stime);break;case'S':SJF(Atime,Stime);break;case'R':RR(Atime,Stime);break;case'H':HRN(Atime,Stime);break;default:printf(error);}}voidFCFS(floatAtime[],floatStime[]){floatCtime[5];floatZZtime[5];floatDQtime[5];inti;Ctime[0]=Stime[0];for(i=1;i5;i++)Ctime[i]=Stime[i]+Ctime[i-1];for(i=0;i5;i++)printf(%5.2f,Ctime[i]);printf(\n);for(i=0;i5;i++){ZZtime[i]=Ctime[i]-Atime[i];printf(%5.2f,ZZtime[i]);}printf(\n);for(i=0;i5;i++){DQtime[i]=ZZtime[i]/Stime[i];printf(%5.2f,DQtime[i]);}printf(\n);}voidSJF(floatAtime[],floatStime[]){floatCtime[5];floatZZtime[5];floatDQtime[5];inti,j;floatm,n;Ctime[0]=Stime[0];ZZtime[0]=Ctime[0]-Atime[0];DQtime[0]=ZZtime[0]/Stime[0];for(j=1;j=3;j++)for(i=1;i=4-j;i++)if(Stime[i]Stime[i+1]){m=Stime[i];Stime[i]=Stime[i+1];Stime[i+1]=m;n=Atime[i];Atime[i]=Atime[i+1];Atime[i+1]=n;}for(i=0;i5;i++)printf(%5.2f,Atime[i]);printf(\n);for(i=0;i5;i++)printf(%5.2f,Stime[i]);printf(\n);for(i=1;i5;i++){Ctime[i]=Stime[i]+Ctime[i-1];}for(i=0;i5;i++)printf(%5.2f,Ctime[i]);printf(\n);for(i=1;i5;i++)ZZtime[i]=Ctime[i]-Atime[i];for(i=0;i5;i++)printf(%5.2f,ZZtime[i]);printf(\n);for(i=1;i5;i++)DQtime[i]=ZZtime[i]/Stime[i];for(i=0;i5;i++)printf(%5.2f,DQtime[i]);printf(\n);}voidRR(floatAtime[],floatStime[]){floatCtime[5];floatZZtime[5];floatDQtime[5];inti,j,h,f,q;floatt[5],k;scanf(%d,&q);for(i=0;i5;i++){if(qStime[i]){for(j=0;j5;j++){k=Stime[j]/q-1;t[j]=Atime[j]+k*(5/q)+1;for(h=0;h5;h++){if(Stime[h]k){f=h;}elseCtime[j]=t[j];}Ctime[j]=t[j]-(k-Stime[f]);}}else{Ctime[0]=Stime[0];for(i=1;i5;i++)Ctime[i]=Stime[i]+Ctime[i-1];}for(i=0;i5;i++)ZZtime[i]=Ctime[i]-Atime[i];for(i=0;i5;i++)DQtime[i]=ZZtime[i]/Stime[i];for(i=0;i5;i++)printf(%5.2f,Ctime[i]);printf(\n);for(i=0;i5;i++)printf(%5.2f,ZZtime[i]);printf(\n);for(i=0;i5;i++)printf(%5.2f,DQtime[i]);printf(\n);}}voidHRN(floatAtime[],floatStime[]){floatCtime[5];floatZZtime[5];floatDQtime[5];inti,j,t=1;floatm,n,k,f;Ctime[0]=Stime[0];ZZtime[0]=Ctime[0]-Atime[0];DQtime[0]=ZZtime[0]/Stime[0];for(j=1;j=3-t;j++)for(i=1;i=4-j-t;i++){k=Ctime[j-1]-Atime[i];f=Ctime[j-1]-Atime[i+1];if(k/Stime[i]f/Stime[i+1]){m=Stime[i];Stime[i]=Stime[i+1];Stime[i+1]=m;n=Atime[i];Atime[i]=Atime[i+1];Atime[i+1]=n;t++;}}for(i=0;i5;i++)printf(%5.2f,Atime[i]);printf(\n);for(i=0;i5;i++)printf(%5.2f,Stime[i]);printf(\n);for(i=1;i5;i++){Ctime[i]=Stime[i]+Ctime[i-1];}for(i=0;i5;i++)printf(%5.2f,Ctime[i]);printf(\n);for(i=1;i5;i++)ZZtime[i]=Ctime[i]-Atime[i];for(i=0;i5;i++)printf(%5.2f,ZZtime[i]);printf(\n);for(i=1;i5;i++)DQtime[i]=ZZtime[i]/Stime[i];for(i=0;i5;i++)printf(%5.2f,DQtime[i]);printf(\n);}七、运行结果及其分析当程序运行,打印出5个进程到达时间:02468和服务时间:36452时,然后再输入要选择的调动服务算法F:FCFSS:SJFR:RRH:HRN可得到不同的完成情况。5个进程完成时间,周转时间,响应比如下面各图中每行所示:FCFS的完成情况:SJF的完成情况HRN的完成情况:在RR的选择运行过程中出现未知问题不能显示,所以暂时没有图片
本文标题:实验五:进程调度
链接地址:https://www.777doc.com/doc-6323523 .html