磁盘调度算法一、实验目的1、对磁盘调度的相关知识作进一步的了解,明确磁盘调度的原理。2、加深理解磁盘调度的主要任务。3、通过编程,掌握磁盘调度的主要算法。二、实验内容和要求1、对于如下给定的一组磁盘访问进行调度:2、要求分别采用先来先服务、最短寻道优先以及电梯调度方法进行调度。3、要求给出每种算法中磁盘访问的顺序,计算出平均移动道数。4、假定当前读写头在90号,向磁道号增加的方向移动。三、实验报告1、程序中使用的数据结构及符号说明。2、给出主要算法的流程图。3、给出程序清单并附上注释。4、给出测试数据和运行结果。#includeiostream#includeiomanip#includemath.husingnamespacestd;constintMaxNumber=100;intTrackOrder[MaxNumber];intMoveDistance[MaxNumber];//----移动距离;intFindOrder[MaxNumber];//-----寻好序列。doubleAverageDistance;//-----平均寻道长度booldirection;//-----方向true时为向外,false为向里intBeginNum;//----开始磁道号。intM;//----磁道数。intN;//-----提出磁盘I/O申请的进程数intSortOrder[MaxNumber];//----排序后的序列boolFinished[MaxNumber];请求服务到达ABCDEFGHIJK访问的磁道号30501001802090150708010160voidInith(){cout请输入磁道数(最大磁盘数目):;cinM;cout请输入提出磁盘I/O申请的进程数:;cinN;cout请依次输入要访问的磁道号:;for(inti=0;iN;i++)cinTrackOrder[i];for(intj=0;jN;j++)MoveDistance[j]=0;cout请输入开始磁道号:;cinBeginNum;for(intk=0;kN;k++)Finished[k]=false;for(intl=0;lN;l++)SortOrder[l]=TrackOrder[l];}//=====================排序函数,将各进程申请的磁道按从小到大排列=================voidSort(){//------冒泡排序inttemp;for(inti=N-1;i=0;i--)for(intj=0;ji;j++){if(SortOrder[j]SortOrder[j+1]){temp=SortOrder[j];SortOrder[j]=SortOrder[j+1];SortOrder[j+1]=temp;}}}//============先来先服务=================================voidFCFS(){inttemp;temp=BeginNum;//--------将BeginNum赋给temp作为寻道时的当前所在磁道号for(inti=0;iN;i++){MoveDistance[i]=abs(TrackOrder[i]-temp);//-------计算移动磁道数temp=TrackOrder[i];//-------寻到后,将此道作为当前所在磁道号,赋给tempFindOrder[i]=TrackOrder[i];//-----寻好的赋给寻好序列}}//========最短寻道法=============================voidSSTF(){inttemp,n;intA=M;temp=BeginNum;//--------将BeginNum赋给temp作为寻道时的当前所在磁道号for(inti=0;iN;i++){for(intj=0;jN;j++)//-------寻找最短的寻道长度{if(abs(TrackOrder[j]-temp)A&&Finished[j]==false){A=abs(TrackOrder[j]-temp);n=j;}elsecontinue;}Finished[n]=true;//-------将已经寻找到的Finished赋值为trueMoveDistance[i]=A;//-------寻道长度temp=TrackOrder[n];//-------当前寻道号。A=M;//-----重置A值FindOrder[i]=TrackOrder[n];//----寻好的赋给寻好序列}}//=====================S扫描算法(电梯调度算法)==========================voidSCAN(){intm,n,temp;temp=BeginNum;Sort();//------排序cout请选择开始方向:.向外扫描;0.向里扫描;//------选择扫描方向cinm;if(m==1)direction=true;elseif(m==0)direction=false;elsecout输入错误!;for(inti=0;iN;i++){if(SortOrder[i]BeginNum)continue;else{n=i;break;}}if(direction==true)//------选择向外{for(inti=n;iN;i++){MoveDistance[i-n]=abs(SortOrder[i]-temp);temp=SortOrder[i];FindOrder[i-n]=SortOrder[i];}for(intj=n-1;j=0;j--){MoveDistance[N-1-j]=abs(SortOrder[j]-temp);temp=SortOrder[j];FindOrder[N-1-j]=SortOrder[j];}}else//-------选择向里{for(inti=n-1;i=0;i--){MoveDistance[N-i-4]=abs(SortOrder[i]-temp);temp=SortOrder[i];FindOrder[N-i-4]=SortOrder[i];}for(intj=n;jN;j++){MoveDistance[j]=abs(SortOrder[j]-temp);temp=TrackOrder[j];FindOrder[j]=SortOrder[j];}}}voidCount(){intTotal=0;for(inti=0;iN;i++){Total+=MoveDistance[i];}AverageDistance=((double)Total)/((double)N);}voidShow(){cout================从BeginNum号磁道开始=====================endl;coutsetw(20)被访问的下一个磁道号setw(20)移动距离(磁道数)endl;for(inti=0;iN;i++){coutsetw(15)FindOrder[i]setw(15)MoveDistance[i]endl;}coutsetw(20)平均寻道长度:AverageDistanceendl;coutendl;}intmain(){inty=1;ints;Inith();while(y){cout请选择寻道方式:.先来先服务算法;2.最短寻道优先算法;3.电梯调度算法(扫描算法);cins;switch(s){case1:FCFS();Count();Show();break;case2:SSTF();Count();Show();break;case3:SCAN();Count();Show();break;}cout是否继续选择寻道算法?.是;.否;intp;cinp;y=p;}return0;}先来先服务最短寻道优先算法电梯调度算法(1)向外扫描(2)向里扫描