1实验一先来先服务FCFS和短作业优先SJF进程调度算法.docx
- 文档编号:7032500
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:13
- 大小:250.88KB
1实验一先来先服务FCFS和短作业优先SJF进程调度算法.docx
《1实验一先来先服务FCFS和短作业优先SJF进程调度算法.docx》由会员分享,可在线阅读,更多相关《1实验一先来先服务FCFS和短作业优先SJF进程调度算法.docx(13页珍藏版)》请在冰点文库上搜索。
1实验一先来先服务FCFS和短作业优先SJF进程调度算法
实验一先来先服务FCFS和短作业优先SJF进程调度算法
一:
需求分析
程序设计的任务:
设计程序模拟进程的先来先服务FCFS和短作业优先SJF调度过程。
假设有n个x进程分别在T1,…,Tn时刻到达系统,它们需要的服务时间分别为S1,…,Sn。
分别采用先来先服务FCFS和短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。
(1)输入的形式和输入值的范围
为免去测试时候需要逐步输入数据的麻烦,输入时采用输入文件流方式将数据放在.txt文件中,第一行为进程个数,第二行为进程到达时间(各个进程的到达时间之间用空格隔开),第三行为进程的服务时间(每个服务时间之间用空格隔开)。
(2)输出的形式
模拟整个调度过程,输出每个时刻的进程运行状态,同时输出了每个进程的完成时间,并且按要求输出了计算出来的每个进程的周转时间、带权周转时间、所有进程的平均周转时间以及带权平均周转时间。
(3)程序所能达到的功能
能够模拟出进程的先来先服务FCFS算法和短作业优先SJF算法的调度过程,输入进程个数n;每个进程的到达时间T1,…,Tn和服务时间S1,…,Sn;选择算法1-FCFS,2-SJF,3-退出,用户做出选择即可输出对应的算法调度过程或者退出程序。
(4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果
测试数据及其输出结果:
作业
算法
进程名
A
B
C
D
E
平均
到达时间
0
1
2
3
4
服务时间
4
3
5
2
4
FCFS
完成时间
4
7
12
14
18
周转时间
4
6
10
11
14
9
带权周转时间
1
2
2
5.5
3.5
2.8
SJF
完成时间
4
9
18
6
13
周转时间
4
8
16
3
9
8
带权周转时间
1
2.67
3.2
1.5
2.25
2.1
也可看下面截图的测试结果
二:
概要设计
程序包括主函数、FCFS算法函数、SJF算法函数、输出函数;
主函数流程:
输入文件中的数据—显示各进程数据—选择算法—调用相应算法的函数—输出结果
三:
详细设计
算法流程图:
FCFS先来先服务算法流程图:
SJF算法流程图:
四:
调试分析
(1):
调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析;
开始的时候没有判断进程是否到达,导致短进程优先算法运行结果错误,后来加上了判断语句后就解决了改问题。
(2):
算法的性能分析及其改进设想;
即使用户输入的进程到达时间没有先后顺序也能准确的计算出结果。
(加循环,判断各个进程的到达时间先后,组成一个有序的序列)
(3):
经验和体会。
通过本次实验,深入理解了先来先服务和短进程优先进程调度算法的思想,培养了自己的动手能力,通过实践加深了记忆。
五:
用户使用说明
在同一目录下的.txt文件中按输入要求输入相关数据,并且根据提示选择相应的算法。
六:
测试结果
测试数据:
输出结果:
七:
附录
源程序:
#include
#include
#include
#include
usingnamespacestd;
constintMaxNum=100;
intArrivalTime[MaxNum];//到达时间
intServiceTime[MaxNum];//服务时间
intFinishTime[MaxNum];//完成时间
intWholeTime[MaxNum];//周转时间
doubleWeightWholeTime[MaxNum];//带权周转时间
doubleAverageWT_FCFS,AverageWT_SJF;//平均周转时间
doubleAverageWWT_FCFS,AverageWWT_SJF;//平均带权周转时间
voidFCFS(intn);//先来先服务
voidSJF(intn);//短作业优先
voidprint(intn,intarray[]);
voidprint(intn,doublearray[]);
voidprintproceed(intn);//输出FCFS进程运行状态
voidmain()
{
intn,i,j;//n:
进程数;i、j:
循环计数变量
ifstreamin("text.txt");//读文件
strings;
for(i=0;i<3,getline(in,s);i++)
{//当i=0读入进程数n;i=1读入各进程到达时间;i=2读入各进程服务时间
istringstreamsin(s);
switch(i)
{
case0:
sin>>n;
break;
case1:
for(j=0;j sin>>ArrivalTime[j]; break; case2: for(j=0;j sin>>ServiceTime[j]; break; } } //显示各进程数据 cout< (1)<<""; charch='A'; for(i=0;i cout< cout< for(i=0;i cout< cout< for(i=0;i cout< cout< //选择算法: 先来先服务FCFS-->1短作业优先SJF-->2关闭-->0 cout<<"请选择算法: FCFS-->1SJF-->2退出-->0"< "; intchoice; cin>>choice; while(choice! =0)//直到输入值为0跳出循环,结束程序 { while(choice! =1&&choice! =2&&choice! =0) { cout<<"Pleaseenter0,1or2! "< cin>>choice; } if(choice==0) return; if(choice==1) FCFS(n);//进行先来先服务FCFS算法 else SJF(n);//进行短作业优先服务SJF算法 cout< FCFS-->1SJF-->2退出-->0"< "; cin>>choice; } return; } //------------------先来先服务---------------------------------------- voidFCFS(intn) { //第一个进程先服务 FinishTime[0]=ArrivalTime[0]+ServiceTime[0]; WholeTime[0]=FinishTime[0]-ArrivalTime[0]; WeightWholeTime[0]=double(WholeTime[0])/double(ServiceTime[0]); for(inti=1;i { if(FinishTime[i-1]>ArrivalTime[i]) FinishTime[i]=FinishTime[i-1]+ServiceTime[i];//如果上一个进程的完成时间大于下一个进程的到达时间, //那么下一个进程的开始时间从上一个进程的完成时间开始 else FinishTime[i]=ArrivalTime[i]+ServiceTime[i];//否则,下一个进程的开始时间从它本身的到达时间开始 WholeTime[i]=FinishTime[i]-ArrivalTime[i]; WeightWholeTime[i]=double(WholeTime[i])/double(ServiceTime[i]); } doubletotalWT=0,totalWWT=0; for(intj=0;j {//循环累加,求总的周转时间,总的带权周转时间 totalWT+=WholeTime[j]; totalWWT+=WeightWholeTime[j]; } AverageWT_FCFS=totalWT/double(n); AverageWWT_FCFS=totalWWT/double(n); //输出各结果 cout<<"---------先来先服务FCFS--------------"< cout<<"完成时间分别为: "; print(n,FinishTime); cout<<"周转时间分别为: "; print(n,WholeTime); cout<<"带权周转时间分别为: "; print(n,WeightWholeTime); cout<<"平均周转时间: "< cout<<"平均带权周转时间: "< printproceed(n); } //------------------短作业优先-------------------------------- voidSJF(intn) { intShort;//存放当前最短作业的序号 intFinish=0;//存放当前完成时间 doubletotalWT=0,totalWWT=0; for(inta=0;a FinishTime[a]=0; inti;//循环计数累加变量 for(i=0;i { inttag=0;//用于标记当前完成时间内,是否找到短作业 intMax=10000; for(intj=0;j { if(FinishTime[j]==0&&ArrivalTime[j]<=Finish&&ServiceTime[j]<=Max) { Max=ServiceTime[j]; Short=j; tag=1; } } if(tag==1) {//找到短作业 FinishTime[Short]=Finish+ServiceTime[Short]; } if(tag==0) {//未找到 for(intk=0;k {//直接进入下一未完成进程 Short=k; break; } FinishTime[Short]=ArrivalTime[Short]+ServiceTime[Short]; } Finish=FinishTime[Short]; } for(i=0;i {//计算周转时间、带权周转时间 WholeTime[i]=FinishTime[i]-ArrivalTime[i]; WeightWholeTime[i]=double(WholeTime[i])/double(ServiceTime[i]); } for(intj=0;j {//计算总的周转时间、总的带权周转时间 totalWT+=WholeTime[j]; totalWWT+=WeightWholeTime[j]; } AverageWT_FCFS=totalWT/double(n); AverageWWT_FCFS=totalWWT/double(n); //输出各值 cout<<"---------短作业优先SJF--------------"< cout<<"完成时间: "; print(n,FinishTime); cout<<"周转时间: "; print(n,WholeTime); cout<<"带权周转时间: "; print(n,WeightWholeTime); cout<<"平均周转时间: "< cout<<"平均带权周转时间: "< printproceed(n); } voidprint(intn,intarray[]) {//打印int型数组 for(inti=0;i cout< cout< } voidprint(intn,doublearray[]) {//打印double型数组 for(inti=0;i cout< cout< } voidprintproceed(intn) {//打印各时刻各进程的运行情况 charch='A'; for(inti=0;i { intStartTime=FinishTime[i]-ServiceTime[i]; cout<<"时刻"< 进程"< cout<<"时刻"< 进程"< } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 一先来先 服务 FCFS 作业 优先 SJF 进程 调度 算法