先来先服务FCFS和短作业优先SJF进程调度算法1、实验目的通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。2、需求分析(1)输入的形式和输入值的范围输入值:进程个数Num范围:0Num=100依次输入Num个进程的到达时间范围:依次输入Num个进程的服务时间范围:输入要使用的算法(1-FCFS,2-SJF)范围:1或者2(2)输出的形式(X表示变量)时刻X:进程X开始运行。其完成时间:X周转时间:X带权周转时间:X…(省略(Num-1)个)平均周转时间:X平均带权周转时间:X(3)程序所能达到的功能输入进程个数Num,每个进程到达时间ArrivalTime[i],服务时间ServiceTime[i]。采用先来先服务FCFS或者短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计Num个进程的平均周转时间和平均带权周转时间。3、概要设计说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。4、详细设计5、调试分析(1)调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析○1开始的时候没有判断进程是否到达,导致短进程优先算法运行结果错误,后来加上了判断语句后就解决了改问题。○2基本完成的设计所要实现的功能,总的来说,FCFS编写容易,SJF需要先找到已经到达的进程,再从已经到达的进程里找到进程服务时间最短的进程,再进行计算。(2)算法的改进设想改进:即使用户输入的进程到达时间没有先后顺序也能准确的计算出结果。(就是再加个循环,判断各个进程的到达时间先后,组成一个有序的序列)(3)经验和体会通过本次实验,深入理解了先来先服务和短进程优先进程调度算法的思想,培养了自己的动手能力,通过实践加深了记忆。6、用户使用说明(1)输入进程个数Num(2)依次输入Num个进程的到达时间(3)依次输入Num个进程的服务时间(4)选择要使用的算法7、测试结果正确一(FCFS):正确一(SJF):正确二(FCFS):正确二(SJF):错误(进程个数错误):错误(选择算法错误):8、附录//*******************************************************************//**进程调度算法BY:09软件工程二班李群**//*******************************************************************#includeiostream#includeiomanipusingnamespacestd;staticconstintMax=100;intArrivalTime[Max];//到达时间intServiceTime[Max];//服务时间intFinishTime[Max];//完成时间intWholeTime[Max];//周转时间doubleWeightWholeTime[Max];//帯权周庄时间doubleAverageWT_FCFS,AverageWT_SJF;//平均周转时间doubleAverageWWT_FCFS,AverageWWT_SJF;//平均帯权周转时间intServiceTime_SJF[Max];//在SJF算法中使用到intNum=0;intNowTime=0;//记录当前时间doubleSumWT=0,SumWWT=0;//SumWT用来计算总的周转时间,SumWWT用来计算总的帯权周转时间inti;intchoice;//记录选择//******************************************************************//先到先服务算法//******************************************************************voidFCFS()//找最早到达的。{cout--------------------------------------------------------------endl;cout-----------------------------FCFS-----------------------------endl;cout--------------------------------------------------------------endl;for(i=0;iNum;i++){if(ArrivalTime[i]NowTime)//假如进程到达的时间比现在已经运行的时间NowTime大,说明在NowTime时刻进程未到达{NowTime=ArrivalTime[i];//把进程的到达时间赋给NowTime}NowTime+=ServiceTime[i];//把进程的服务时间加到NowTime上FinishTime[i]=NowTime;//计算完成时间WholeTime[i]=FinishTime[i]-ArrivalTime[i];//计算周转时间=完成时间-到达时间WeightWholeTime[i]=(double)WholeTime[i]/ServiceTime[i];//计算带权周转时间=周转时间/服务时间SumWT+=WholeTime[i];//计算总的周转时间SumWWT+=WeightWholeTime[i];//计算总的帯权周转时间}AverageWT_FCFS=SumWT/Num;//平均周转时间AverageWWT_FCFS=SumWWT/Num;//平均帯权周转时间for(i=0;iNum;i++)//依次输出结果{cout时刻FinishTime[i]-ServiceTime[i]:进程i+1开始运行。其完成时间:FinishTime[i]周转时间:WholeTime[i]setprecision(3)帯权周转时间:WeightWholeTime[i]setprecision(3)endl;}cout平均周转时间:AverageWT_FCFSendl;cout平均帯权周转时间:AverageWWT_FCFSendl;}//******************************************************************//短进程优先算法//******************************************************************voidSJF()//找已经到达的且服务时间最短的进程(假定输入的进程是按照到达时间先后输入的){cout--------------------------------------------------------------endl;cout-----------------------------SJF------------------------------endl;cout--------------------------------------------------------------endl;intmin=0;NowTime=ArrivalTime[0]+ServiceTime[0];//计算第一次的NowTImeFinishTime[0]=NowTime;//计算第一个进程的完成时间ServiceTime_SJF[0]=1000;//赋初值。cout时刻FinishTime[0]-ServiceTime[0]:进程1开始运行。;intallin=0,j,k;for(i=1;iNum;i++)//进入循环,从第二个到达的进程开始{k=1;min=0;if(allin==0)//找到已经到达的进程个数{j=0;while(ArrivalTime[j]=NowTime&&jNum)//已经到达的进程{j++;if(j=Num){allin=1;}}}else{j=Num;}j=j-1;//j是已经到达的进程数while(k=j)//从已经到达的进程里找到服务时间最短的进程{if(ServiceTime_SJF[k]==0)//进程的服务时间如果等于0,则跳过该进程k++;else{if(ServiceTime_SJF[min]ServiceTime_SJF[k])//比较,找到服务时间最短的进程min=k;k++;}}ServiceTime_SJF[min]=0;//找完后置零,便于下一次循环时使用NowTime+=ServiceTime[min];//累加当前时间FinishTime[min]=NowTime;//完成时间}for(i=0;iNum;i++)//计算周转时间,带权周转时间,总的周转时间和总的带权周转时间{WholeTime[i]=FinishTime[i]-ArrivalTime[i];WeightWholeTime[i]=(double)WholeTime[i]/ServiceTime[i];SumWT+=WholeTime[i];SumWWT+=WeightWholeTime[i];}AverageWT_SJF=SumWT/Num;//平均周转时间AverageWWT_SJF=SumWWT/Num;//平均带权周转时间cout其完成时间:FinishTime[0]周转时间:WholeTime[0]setprecision(3)帯权周转时间:WeightWholeTime[0]setprecision(3)endl;for(i=1;iNum;i++)//输出结果{cout时刻FinishTime[i]-ServiceTime[i]:进程i+1开始运行。其完成时间:FinishTime[i]周转时间:WholeTime[i]setprecision(3)帯权周转时间:WeightWholeTime[i]setprecision(3)endl;}cout平均周转时间:AverageWT_SJFendl;cout平均帯权周转时间:AverageWWT_SJFendl;}//******************************************************************//输入函数//******************************************************************voidinput(){cout请输入进程个数:;cinNum;while(Num100||Num=0){cout进程个数必须大于0且小于等于100!请重新输入进程个数:;cinNum;}cout-----------------------------------------endl;for(i=0;iNum;i++){cout请输入第i+1个进程的到达时间:;cinArrivalTime[i];}cout-----------------------------------------endl;for(i=0;iNum;i++){intdata=0;cout请输入第i+1个进程的服务时间:;cindata;ServiceTime[i]=data;ServiceTime_SJF[i]=data;}cout-----------------------------------------endl;cout请选择要使用的算法(1-FCFS,2-SJ