先来先服务FCFS和短作业优先SJF进程调度算法实验报告材料.docx
- 文档编号:29658186
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:14
- 大小:165.08KB
先来先服务FCFS和短作业优先SJF进程调度算法实验报告材料.docx
《先来先服务FCFS和短作业优先SJF进程调度算法实验报告材料.docx》由会员分享,可在线阅读,更多相关《先来先服务FCFS和短作业优先SJF进程调度算法实验报告材料.docx(14页珍藏版)》请在冰豆网上搜索。
先来先服务FCFS和短作业优先SJF进程调度算法实验报告材料
先来先服务FCFS和短作业优先SJF进程调度算法
1、实验目的
通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。
2、需求分析
(1)输入的形式和输入值的范围
输入值:
进程个数Num范围:
0 依次输入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)调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析 开始的时候没有判断进程是否到达,导致短进程优先算法运行结果错误,后来加上了判断语句后就解决了改问题。 基本完成的设计所要实现的功能,总的来说,FCFS编写容易,SJF需要先找到已经到达的进程,再从已经到达的进程里找到进程服务时间最短的进程,再进行计算。 (2)算法的改进设想 改进: 即使用户输入的进程到达时间没有先后顺序也能准确的计算出结果。 (就是再加个循环,判断各个进程的到达时间先后,组成一个有序的序列) (3)经验和体会 通过本次实验,深入理解了先来先服务和短进程优先进程调度算法的思想,培养了自己的动手能力,通过实践加深了记忆。 6、用户使用说明 (1)输入进程个数Num (2)依次输入Num个进程的到达时间 (3)依次输入Num个进程的服务时间 (4)选择要使用的算法 7、测试结果 正确一(FCFS): 正确一(SJF): 正确二(FCFS): 正确二(SJF): 错误(进程个数错误): 错误(选择算法错误): 8、附录 //******************************************************************* //**进程调度算法BY: 09软件工程二班李群** //******************************************************************* #include #include usingnamespacestd; 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<<"--------------------------------------------------------------"< cout<<"-----------------------------FCFS-----------------------------"< cout<<"--------------------------------------------------------------"< for(i=0;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;i { cout<<"时刻"< 进程"< "<<"其完成时间: "< "< "< } cout<<"平均周转时间: "< cout<<"平均帯权周转时间: "< } //****************************************************************** //短进程优先算法 //****************************************************************** voidSJF()//找已经到达的且服务时间最短的进程(假定输入的进程是按照到达时间先后输入的) { cout<<"--------------------------------------------------------------"< cout<<"-----------------------------SJF------------------------------"< cout<<"--------------------------------------------------------------"< intmin=0; NowTime=ArrivalTime[0]+ServiceTime[0];//计算第一次的NowTIme FinishTime[0]=NowTime;//计算第一个进程的完成时间 ServiceTime_SJF[0]=1000;//赋初值。 cout<<"时刻"< 进程"<<1<<"开始运行。 "; intallin=0,j,k; for(i=1;i { k=1;min=0; 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<<"其完成时间: "< "< "< for(i=1;i { cout<<"时刻"< 进程"< "<<"其完成时间: "< "< "< } cout<<"平均周转时间: "< cout<<"平均帯权周转时间: "< } //****************************************************************** //输入函数 //****************************************************************** voidinput() { cout<<"请输入进程个数: "; cin>>Num; while(Num>100||Num<=0) { cout<<"进程个数必须大于0且小于等于100! 请重新输入进程个数: "; cin>>Num; } cout<<"-----------------------------------------"< for(i=0;i { cout<<"请输入第"< "; cin>>ArrivalTime[i]; } cout<<"-----------------------------------------"< for(i=0;i { intdata=0; cout<<"请输入第"< "; cin>>data; ServiceTime[i]=data; ServiceTime_SJF[i]=data; } cout<<"-----------------------------------------"< cout<<"请选择要使用的算法(1-FCFS,2-SJF): "; cin>>choice; } //****************************************************************** //主函数 //****************************************************************** voidmain() { cout<<"*******************************************************************"< cout<<"**进程调度算法BY: 09软件工程二班李群**"< cout<<"*******************************************************************"< charflag='y'; Loop: NowTime=0;SumWT=0;SumWWT=0;//参数初始化 input();//输入 if(choice==1) FCFS();//调用FCFS算法 elseif(choice==2) SJF();//调用SJF算法 else//输入有误,则重新选择 { while (1) { cout<<"您的选择有误! 请重新选择! "< cout<<"请选择要使用的算法(1-FCFS,2-SJF): "; cin>>choice; if(choice==1) { FCFS(); break; } elseif(choice==2) { SJF(); break; } } } cout< "; cin>>flag; if(flag=='y'||flag=='Y') gotoLoop; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 先来先 服务 FCFS 作业 优先 SJF 进程 调度 算法 实验 报告 材料