先来先服务FCFS和短作业优先SJF进程调度算法学⽣姓名:学⽣学号:专业班级:指导⽼师:2013年6⽉20⽇1、实验⽬的:
通过这次实验,加深对进程概念的理解,进⼀步掌握进程状态的转变、进程调度的策略及对系统性能的评价⽅法。2、问题描述:
假设有n个进程分别在T1, … ,T n时刻到达系统,它们需要的服务时间分别为S1, … ,S n。分别采⽤先来先服务FCFS和短作业优先SJF 进程调度算法进⾏调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。3、需求分析
(1) 输⼊的形式和输⼊值的范围输⼊值:进程个数Num 范围:0依次输⼊Num个进程的服务时间范围:
输⼊要使⽤的算法范围:1或者2 (2) 输出的形式(X表⽰变量)时刻X:进程X开始运⾏。其完成时间:X周转时间:X带权周转时间:X…(省略(Num-1)个)
平均周转时间:X平均带权周转时间:X(3) 程序所能达到的功能
输⼊进程个数Num,每个进程到达时间ArrivalTime[i],服务时间ServiceTime[i]。采⽤先来先服务FCFS或者短作业优先SJF进程调度算法进⾏调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计Num个进程的平均周转时间和平均带权周转时间。4、概要设计
(1)程序中进程调度时间变量描述如下:
(2)程序流程变量初始化;
接收⽤户输⼊n,T1, … ,T n,S1, … ,S n;算法选择1-FCFS,2-SJF;按照选择算法进⾏进程调度,计算进程的完成时间、周转时间和带权周转时间;计算所有进程的平均周转时间和平均带权周转时间;按格式输出调度结果。5、详细设计先来先服务算法:
//******************************************************************// 先到先服务算法
//******************************************************************void FCFS() //找最早到达的。{
cout<<\"--------------------------------------------------------------\" 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;i{ cout<<\"时刻\"<} cout<<\"平均周转时间:\" //******************************************************************// 短进程优先算法 //****************************************************************** void SJF() //找已经到达的且服务时间最短的进程(假定输⼊的进程是按照到达时间先后输⼊的){cout<<\"--------------------------------------------------------------\" if(allin==0) //找到已经到达的进程个数{j=0; while(ArrivalTime[j]<=NowTime && j{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;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<<\" 其完成时间:\" cout<<\"时刻\"<} cout<<\"平均周转时间:\" void SJF(){sjf算法} void input(){ 输⼊进程个数 输⼊每个进程的到达时间输⼊每个进程的服务时间} void main() //主函数{ 输⼊choice,选择使⽤哪个算法if(choice==1){ FCFS();//调⽤FCFS算法} else if(choice==2){ SJF();//调⽤SJF}} 6、调试分析 (1)调试过程中遇到的问题以及解决⽅法,设计与实现的回顾讨论和分析: ○1开始的时候没有判断进程是否到达,导致短进程优先算法运⾏结果错误,后来加上了判断语句后就解决了改问题。○2基本完成的设计所要实现的功能,总的来说,FCFS编写容易,SJF需要先找到已经到达的进程,再从已经到达的进程⾥找到进程服务时间最短的进程,再进⾏计算。 (2)算法的改进设想:即使⽤户输⼊的进程到达时间没有先后顺序也能准确的计算出结果。(就是再加个循环,判断各个进程的到达时间先后,组成⼀个有序的序列)。7、⽤户使⽤说明(1)输⼊进程个数Num (2)依次输⼊Num个进程的到达时间(3)依次输⼊Num个进程的服务时间(4)选择要使⽤的算法8、测试结果 ①选择FCFS算法运⾏结果: ②选择SJF算法运⾏结果: ③不合法的输⼊运⾏结果: 9、存在问题 两种算法(FCFS算法与SJF算法)不能够连续选择,选择其⼀得到运⾏结果后,若要使⽤另⼀种算法则需要重新调试运⾏程序,输⼊⽐较⿇烦。10、⼼得体会 通过使⽤C++程序设计语⾔对先到先服务(FCFS)算法和短作业优先(SJF)算法进⾏编程设计,使我对这两种算法有了更深的了解和更完整的掌握,也在编程过程中对这两种算法的优缺点有了体会,并且加强了⾃⼰的编程能⼒。11、附录程序源代码: //*******************************************************************//** FCFS和SJF进程调度算法张迪 1025116022 **//*******************************************************************#include#include using namespace std;static const int Max=100;int ArrivalTime[Max]; //到达时间int ServiceTime[Max]; //服务时间int FinishTime[Max]; //完成时间int WholeTime[Max]; //周转时间 double WeightWholeTime[Max]; //帯权周庄时间 double AverageWT_FCFS,AverageWT_SJF; //平均周转时间 double AverageWWT_FCFS,AverageWWT_SJF; //平均帯权周转时间int ServiceTime_SJF[Max]; //在SJF算法中使⽤到int Num=0; int NowTime=0; //记录当前时间 double SumWT=0,SumWWT=0; //SumWT⽤来计算总的周转时间,SumWWT⽤来计算总的帯权周转时间int i; int choice; //记录选择 //******************************************************************// 先到先服务算法 //******************************************************************void FCFS() //找最早到达的。{ cout<<\"--------------------------------------------------------------\" 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;i{ cout<<\"时刻\"<\"<} cout<<\"平均周转时间:\" //****************************************************************** void SJF() //找已经到达的且服务时间最短的进程(假定输⼊的进程是按照到达时间先后输⼊的){ cout<<\"--------------------------------------------------------------\" if(allin==0) //找到已经到达的进程个数{j=0; while(ArrivalTime[j]<=NowTime && j{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;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<<\" 其完成时间:\" cout<<\"平均周转时间:\" // 输⼊函数 //******************************************************************void input(){ cout<<\"请输⼊进程个数:\";cin>>Num; while(Num>100||Num<=0){ cout<<\"进程个数必须⼤于0且⼩于等于100!请重新输⼊进程个数:\";cin>>Num;} cout<<\"-----------------------------------------\" cout<<\"-----------------------------------------\" ServiceTime[i]=data;ServiceTime_SJF[i]=data;} cout<<\"-----------------------------------------\" //******************************************************************// 主函数 //******************************************************************void main(){ cout<<\"*******************************************************************\" FCFS(); //调⽤FCFS算法else if(choice==2)SJF(); //调⽤SJF算法else //输⼊有误,则重新选择{while(1){ cout<<\"您的选择有误!请重新选择!\"< cout<<\"请选择要使⽤的算法(1-FCFS,2-SJF): \";cin>>choice;if(choice==1){FCFS();break;} else if(choice==2){SJF();break;}}}} 因篇幅问题不能全部显示,请点此查看更多更全内容