广州大学学生实验报告(***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***)一、实验目的要求模拟先来先服务法(First-Come, First-Served,FCFS),最短寻道时间优先法(Shortest Seek Time First, SSTF),电梯法(SCAN),循环扫描算法(CSCAN)四种磁盘调度算法,输入为一组请求访问磁道序列,输出为每种调度算法的磁头移动轨迹和移动的总磁道数。
二、实验内容编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度:1、先来先服务算法(FCFS)2、最短寻道时间优先算法(SSTF)3、扫描算法(SCAN)4、循环扫描算法(CSCAN)三、实验设备带Linux操作系统的电脑一台。
四、实验过程原始数据记录实验代码:#include <iostream>#include <fstream>#include <iomanip>#include <stdio.h>using namespace std;const int MaxNumber=100;int TrackOrder[MaxNumber];//磁盘访问序列int MoveDistance[MaxNumber];//磁头每次移动的距离double AverageDistance;//平均寻道长度bool direction;//SCAN和CSCAN算法的磁头移动方向int M;//开始磁道号int N;//磁道个数void inputData(){cout<<"请输入磁道个数N: ";cin>>N;cout<<"\n请输入磁盘访问顺序(此部分由文件读入)。
"<<endl;fstream fin("F://磁盘调度文件.txt");for(int i=0;i<N;i++)fin>>TrackOrder[i];cout<<"\n请输入开始磁盘号M: ";cin>>M;}void showData(){cout<<"\n===============================显示配置信息=============================\n";cout<<"\n输入磁道个数N为:"<<N<<",开始磁盘号M:"<<M<<endl;cout<<"\n磁盘访问序列为: ";for(int i=0;i<N;i++)cout<<TrackOrder[i]<<" ";cout<<endl;}void FCFS(){int i,j;int sum=0;float avg;int Fcfs[MaxNumber];int sumArray[MaxNumber];for(i=0;i<N;i++)Fcfs[i]=TrackOrder[i];//sum=0;sumArray[0]=abs(M-Fcfs[0]);//cout<<"FCFS磁盘调度算法:"<<endl;cout<<"\n从"<<M<<"号磁道开始"<<endl;cout<<"被访问的下一个磁道号: ";for(i=0;i<N;i++)cout<<Fcfs[i]<<" ";cout<<endl;cout<<"对应移动距离(磁道数): "<<sumArray[0]<<" ";for(i=0,j=1;j<N;i++,j++){sumArray[j]=abs(Fcfs[j]-Fcfs[i]);cout<<sumArray[j]<<" ";}for(i=0;i<N;i++)sum=sum+sumArray[i];avg=(float)sum/N;cout<<"\n总寻道长度:"<<sum;cout<<"\n平均寻道长度:"<<setprecision(3)<<avg<<endl<<endl; }void SSTF(){int i,j;int k=1;int s=0;int temp;int l,r;int sum=0;float avg=0;int Sstf[MaxNumber];int sumArray[MaxNumber];int Mnow;Mnow=M;for(i=0;i<N;i++)Sstf[i]=TrackOrder[i];//sum=0;//sumArray[0]=abs(M-Fcfs[0]);for(i=0;i<N;i++){for(j=i+1;j<N;j++){if(Sstf[i]>Sstf[j])//将磁道号从小到大排序{temp=Sstf[i];Sstf[i]=Sstf[j];Sstf[j]=temp;}}}//cout<<"SSTF磁盘调度算法:"<<endl;cout<<"\n从"<<Mnow<<"号磁道开始"<<endl;cout<<"被访问的下一个磁道号: ";if(Sstf[N-1]<=Mnow)//若被访问的下一个最大的磁道号不大于当前的磁道号{for(i=N-1,s=0;i>=0;i--,s++){cout<<Sstf[i]<<" ";sumArray[s]=Mnow-Sstf[i];sum+=Mnow-Sstf[i];Mnow=Sstf[i];}}else{if(Sstf[0]>=Mnow){for(i=0,s=0;i<N;i++,s++){cout<<Sstf[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){cout<<Sstf[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;j<N;j++){cout<<Sstf[j]<<" ";sumArray[s]=Sstf[j]-Mnow;s=s+1;sum+=Sstf[j]-Mnow;Mnow=Sstf[j];}}else{while(r<N){cout<<Sstf[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--){cout<<Sstf[j]<<" ";sumArray[s]=Mnow-Sstf[j];s=s+1;sum+=Mnow-Sstf[j];Mnow=Sstf[j];}}}}cout<<endl;cout<<"对应移动距离(磁道数): ";for(i=0;i<N;i++){cout<<sumArray[i]<<" ";}avg=(float)sum/N;cout<<"\n总寻道长度:"<<sum;cout<<"\n平均寻道长度:"<<setprecision(3)<<avg<<endl<<endl; }void SCAN(){int i,j;int k=1;int s=0;int temp;int c,l,r;int sum=0;float avg=0;int Scan[MaxNumber];int sumArray[MaxNumber];int Mnow;Mnow=M;for(i=0;i<N;i++)Scan[i]=TrackOrder[i];for(i=0;i<N;i++){for(j=i+1;j<N;j++){if(Scan[i]>Scan[j]){temp=Scan[i];Scan[i]=Scan[j];Scan[j]=temp;}}}cout<<"请选择磁头移动方向[1-增加方向、0-减小方向]: ";cin>>c;//cout<<endl;//cout<<"SCAN磁盘调度算法:"<<endl; cout<<"\n从"<<M<<"号磁道开始"<<endl; cout<<"被访问的下一个磁道号: ";if(Scan[N-1]<=Mnow){for(i=N-1,s=0;i>=0;i--,s++){cout<<Scan[i]<<" ";sumArray[s]=Mnow-Scan[i];sum+=Mnow-Scan[i];Mnow=Scan[i];}}else{if(Scan[0]>=Mnow){for(i=0,s=0;i<N;i++,s++){cout<<Scan[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){case 0:{while(l>=0){cout<<Scan[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;j<N;j++){cout<<Scan[j]<<" ";sumArray[s]=Scan[j]-Mnow;s=s+1;sum+=Scan[j]-Mnow;Mnow=Scan[j];}break;}case 1:{while(r<N){cout<<Scan[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--){cout<<Scan[j]<<" ";//这一步也没错sumArray[s]=Mnow-Scan[j];s=s+1;sum+=Mnow-Scan[j];Mnow=Scan[j];}break;}default:cout<<"输入有误,请重新输入. ";//goto}}}cout<<endl;cout<<"对应移动距离(磁道数): ";for(i=0;i<N;i++){cout<<sumArray[i]<<" ";}avg=(float)sum/N;cout<<"\n总寻道长度:"<<sum;cout<<"\n平均寻道长度:"<<setprecision(3)<<avg<<endl<<endl; }void CSCAN(){int temp;int k=1;int s;int Mnow,l,r,c;int i,j;int sum=0;float avg=0;int Cscan[MaxNumber];int sumArray[MaxNumber];Mnow=M;for(i=0;i<N;i++)Cscan[i]=TrackOrder[i];for(i=0;i<N;i++){for(j=i+1;j<N;j++){if(Cscan[i]>Cscan[j]){temp=Cscan[i];Cscan[i]=Cscan[j];Cscan[j]=temp;}}}cout<<"\n请选择磁头移动方向[1-增加方向、0-减小方向]: ";cin>>c;//cout<<endl;//cout<<"CSCAN磁盘调度算法:"<<endl;cout<<"从"<<M<<"号磁道开始"<<endl;cout<<"被访问的下一个磁道号: ";if(Cscan[N-1]<=Mnow){for(i=0,s=0;i<N;i++,s++){cout<<Cscan[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;i<N;i++,s++){cout<<Cscan[i]<<" ";//sumArray[s]=Scan[i]-Mnow;sum=Cscan[N-1]-Mnow;}}else{while(Cscan[k]<Mnow){k++;}l=k-1;r=k;switch(c){case 0:{for(j=l;j>=0;j--)cout<<Cscan[j]<<" ";for(j=N-1;j>=r;j--)cout<<Cscan[j]<<" ";sum=2*(Cscan[N-1]-Cscan[0])-Cscan[r]+Mnow;break;}case 1:{for(j=r;j<N;j++)cout<<Cscan[j]<<" ";for(j=0;j<r;j++)cout<<Cscan[j]<<" ";sum=2*(Cscan[N-1]-Cscan[0])+Cscan[r-1]-Mnow;break;}default:cout<<"输入有误,请重新输入. ";}}}avg=(float)sum/N;cout<<"\n总寻道长度:"<<sum;cout<<"\n平均寻道长度:"<<setprecision(3)<<avg<<endl<<endl;}int main(){char choice;cout<<"\n===========================虚拟内存页面配置算法=========================\n\n";inputData();showData();cout<<endl;while(1){cout<<"====1-FCFS 磁盘调度算法====\n";cout<<"====2-SSTF 磁盘调度算法====\n";cout<<"====3-SCAN 磁盘调度算法====\n";cout<<"====4-CSCAN磁盘调度算法====\n";cout<<"======其他任意键退出=======\n\n";cout<<"请输入功能键:";cin>>choice;switch(choice){case '1':cout<<"\nFCFS磁盘调度算法==>";FCFS();//cout<<endl;break;case '2':cout<<"\nSSTF磁盘调度算法==>";SSTF();//cout<<endl;break;case '3':cout<<"\nSCAN磁盘调度算法==>";SCAN();//cout<<endl;break;case '4':cout<<"\nCSCAN磁盘调度算法==>";CSCAN();//cout<<endl;break;default:return 1;}}cin>>choice;getchar();return 1;}图1 图2图3 图4五、实验结果分析实验结果:如图1~4所示,创建一个c文件,使用g++编译器编译并执行程序后,成功运行程序并且按照提示输入功能,即可以计算不同的磁盘调度算法的输出结果。