您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 实验六--磁盘调度算法
实验六磁盘调度算法【实验目的】通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的实现方法。【实验内容】问题描述:设计程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。程序要求如下:1)利用先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法模拟磁道访问过程。2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。4)输出:每种算法的平均寻道长度。【实验代码】#includeiostream#includefstream#includeiomanip#includestdio.husingnamespacestd;constintMaxNumber=100;intTrackOrder[MaxNumber];//磁盘访问序列intMoveDistance[MaxNumber];//磁头每次移动的距离doubleAverageDistance;//平均寻道长度booldirection;//SCAN和CSCAN算法的磁头移动方向intM;//开始磁道号intN;//磁道个数voidinputData(){cout请输入磁道个数N:;cinN;cout\n请输入磁盘访问顺序(此部分由文件读入)。endl;fstreamfin(F://TrackOrder3.txt);for(inti=0;iN;i++)finTrackOrder[i];cout\n请输入开始磁盘号M:;cinM;}voidshowData(){cout\n===============================显示配置信息=============================\n;cout\n输入磁道个数N为:N,开始磁盘号M:Mendl;cout\n磁盘访问序列为:;for(inti=0;iN;i++)coutTrackOrder[i];coutendl;}voidFCFS(){inti,j;intsum=0;floatavg;intFcfs[MaxNumber];intsumArray[MaxNumber];for(i=0;iN;i++)Fcfs[i]=TrackOrder[i];//sum=0;sumArray[0]=abs(M-Fcfs[0]);//coutFCFS磁盘调度算法:endl;cout\n从M号磁道开始endl;cout被访问的下一个磁道号:;for(i=0;iN;i++)coutFcfs[i];coutendl;cout对应移动距离(磁道数):sumArray[0];for(i=0,j=1;jN;i++,j++){sumArray[j]=abs(Fcfs[j]-Fcfs[i]);coutsumArray[j];}for(i=0;iN;i++)sum=sum+sumArray[i];avg=(float)sum/N;cout\n总寻道长度:sum;cout\n平均寻道长度:setprecision(3)avgendlendl;}voidSSTF(){inti,j;intk=1;ints=0;inttemp;intl,r;intsum=0;floatavg=0;intSstf[MaxNumber];intsumArray[MaxNumber];intMnow;Mnow=M;for(i=0;iN;i++)Sstf[i]=TrackOrder[i];//sum=0;//sumArray[0]=abs(M-Fcfs[0]);for(i=0;iN;i++){for(j=i+1;jN;j++){if(Sstf[i]Sstf[j])//将磁道号从小到大排序{temp=Sstf[i];Sstf[i]=Sstf[j];Sstf[j]=temp;}}}//coutSSTF磁盘调度算法:endl;cout\n从Mnow号磁道开始endl;cout被访问的下一个磁道号:;if(Sstf[N-1]=Mnow)//若被访问的下一个最大的磁道号不大于当前的磁道号{for(i=N-1,s=0;i=0;i--,s++){coutSstf[i];sumArray[s]=Mnow-Sstf[i];sum+=Mnow-Sstf[i];Mnow=Sstf[i];}}else{if(Sstf[0]=Mnow){for(i=0,s=0;iN;i++,s++){coutSstf[i];sumArray[s]=Sstf[i]-Mnow;sum+=Sstf[i]-Mnow;Mnow=Sstf[i];}}else{while(Sstf[k]Mnow){k++;}l=k-1;r=k;if(Mnow-Sstf[l]=(Sstf[r]-Mnow)){while(l=0){coutSstf[l];sumArray[s]=Mnow-Sstf[l];s=s+1;sum=sum+Mnow-Sstf[l];Mnow=Sstf[l];l=l-1;}Mnow=Sstf[0];for(j=r;jN;j++){coutSstf[j];sumArray[s]=Sstf[j]-Mnow;s=s+1;sum+=Sstf[j]-Mnow;Mnow=Sstf[j];}}else{while(rN){coutSstf[r];sumArray[s]=Sstf[r]-Mnow;s=s+1;sum+=Sstf[r]-Mnow;Mnow=Sstf[r];r=r+1;}Mnow=Sstf[N-1];for(j=1;j=0;j--){coutSstf[j];sumArray[s]=Mnow-Sstf[j];s=s+1;sum+=Mnow-Sstf[j];Mnow=Sstf[j];}}}}coutendl;cout对应移动距离(磁道数):;for(i=0;iN;i++){coutsumArray[i];}avg=(float)sum/N;cout\n总寻道长度:sum;cout\n平均寻道长度:setprecision(3)avgendlendl;}voidSCAN(){inti,j;intk=1;ints=0;inttemp;intc,l,r;intsum=0;floatavg=0;intScan[MaxNumber];intsumArray[MaxNumber];intMnow;Mnow=M;for(i=0;iN;i++)Scan[i]=TrackOrder[i];for(i=0;iN;i++){for(j=i+1;jN;j++){if(Scan[i]Scan[j]){temp=Scan[i];Scan[i]=Scan[j];Scan[j]=temp;}}}cout请选择磁头移动方向[1-增加方向、0-减小方向]:;cinc;//coutendl;//coutSCAN磁盘调度算法:endl;cout\n从M号磁道开始endl;cout被访问的下一个磁道号:;if(Scan[N-1]=Mnow){for(i=N-1,s=0;i=0;i--,s++){coutScan[i];sumArray[s]=Mnow-Scan[i];sum+=Mnow-Scan[i];Mnow=Scan[i];}}else{if(Scan[0]=Mnow){for(i=0,s=0;iN;i++,s++){coutScan[i];sumArray[s]=Scan[i]-Mnow;sum+=Scan[i]-Mnow;Mnow=Scan[i];}}else{while(Scan[k]Mnow){k++;}l=k-1;r=k;switch(c){case0:{while(l=0){coutScan[l];sumArray[s]=Mnow-Scan[l];s=s+1;sum=sum+Mnow-Scan[l];Mnow=Scan[l];l=l-1;}Mnow=Scan[0];for(j=r;jN;j++){coutScan[j];sumArray[s]=Scan[j]-Mnow;s=s+1;sum+=Scan[j]-Mnow;Mnow=Scan[j];}break;}case1:{while(rN){coutScan[r];//这一步没错sumArray[s]=Scan[r]-Mnow;s=s+1;sum+=Scan[r]-Mnow;Mnow=Scan[r];r=r+1;}Mnow=Scan[N-1];for(j=l;j=0;j--){coutScan[j];//这一步也没错sumArray[s]=Mnow-Scan[j];s=s+1;sum+=Mnow-Scan[j];Mnow=Scan[j];}break;}default:cout输入有误,请重新输入.;//goto}}}coutendl;cout对应移动距离(磁道数):;for(i=0;iN;i++){coutsumArray[i];}avg=(float)sum/N;cout\n总寻道长度:sum;cout\n平均寻道长度:setprecision(3)avgendlendl;}voidCSCAN(){inttemp;intk=1;ints;intMnow,l,r,c;inti,j;intsum=0;floatavg=0;intCscan[MaxNumber];intsumArray[MaxNumber];Mnow=M;for(i=0;iN;i++)Cscan[i]=TrackOrder[i];for(i=0;iN;i++){for(j=i+1;jN;j++){if(Cscan[i]Cscan[j]){temp=Cscan[i];Cscan[i]=Cscan[j];Cscan[j]=temp;}}}cout\n请选择磁头移动方向[1-增加方向、0-减小方向]:;cinc;//coutendl;//coutCSCAN磁盘调度算法:endl;cout从M号磁道开始endl;cout被访问的下一个磁道号:;if(Cscan[N-1]=Mnow){for(i=0,s=0;iN;i++,s++){coutCscan[i];//sumArray[s]=Mnow-Cscan[0]+Cscan[N-1];sum=Mnow-Cscan[0]+Cscan[N-1];}}else{if(Cscan[0]=Mnow){for(i=0,s=0;iN;i++,s++){coutCscan[i];//sumArray[s]=Scan[i]-Mnow;sum=Cscan[N-1]-Mnow;}}else{while(Cscan[k]Mnow){k++;}l=k-1;r=k;switch(c){case0:{for(j=l;j=0;j--)coutCscan[j];for(j=N-1;j=r;j--)coutCscan[j];sum=2*(Cscan[N-1]-Cs
本文标题:实验六--磁盘调度算法
链接地址:https://www.777doc.com/doc-5827356 .html