操作系统实验六磁盘调度算法正确C代码文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]《操作系统》实验报告【实验题目】:磁盘调度算法【实验目的】通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务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)输出:每种算法的平均寻道长度。
实验要求:1) 上机前认真复习磁盘调度算法,熟悉FCFS,SSTF,SCAN和循环SCAN算法的过程;2) 上机时独立编程、调试程序;3) 根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。
实验代码:#include<iostream>#include<iomanip>#include<>using namespace std;const int MaxNumber=100;int TrackOrder[MaxNumber];int MoveDistance[MaxNumber];//移动距离int FindOrder[MaxNumber];//寻好序列double AverageDistance;//平均寻道长度bool direction;//方向 true时为向外,false为向里int BeginNum;//开始磁道号int M=500;//磁道数int N;//提出磁盘I/O申请的进程数int SortOrder[MaxNumber];//排序后的序列bool Finished[MaxNumber];void Inith(){cout<<"请输入提出磁盘I/O申请的进程数: ";cin>>N;cout<<"请依次输入要访问的磁道号: ";for(int i=0;i<N;i++)cin>>TrackOrder[i];for(int j=0;j<N;j++)MoveDistance[j]=0;cout<<"请输入开始磁道号: ";cin>>BeginNum;for(int k=0;k<N;k++)Finished[k]=false;for(int l=0;l<N;l++)SortOrder[l]=TrackOrder[l];}//=====================排序函数,将各进程申请的磁道按从小到大排列=================void Sort(){int temp;for(int i=N-1;i>=0;i--)for(int j=0;j<i;j++){if(SortOrder[j]>SortOrder[j+1]){temp=SortOrder[j];SortOrder[j]=SortOrder[j+1];SortOrder[j+1]=temp;}}}//============FCFS,先来先服务================================= void FCFS(){int temp;temp=BeginNum;for(int i=0;i<N;i++){MoveDistance[i]=abs(TrackOrder[i]-temp);temp=TrackOrder[i];FindOrder[i]=TrackOrder[i];}}//========SSTF,最短寻道法=============================void SSTF(){int temp,n;int A=M;temp=BeginNum;for(int i=0;i<N;i++){for(int j=0;j<N;j++){if(abs(TrackOrder[j]-temp)<A&&Finished[j]==false){A=abs(TrackOrder[j]-temp);n=j;}else continue;}Finished[n]=true;MoveDistance[i]=A;temp=TrackOrder[n];A=M;FindOrder[i]=TrackOrder[n];}}//=====================SCAN,扫描算法========================== void SCAN(){int m,n,temp;temp=BeginNum;Sort();cout<<"请选择开始方向:1--向外;0---向里: ";cin>>m;if(m==1)direction=true;else if(m==0)direction=false;elsecout<<"输入错误!";for(int i=0;i<N;i++){if(SortOrder[i]<BeginNum)continue;else{n=i;break;}}if(direction==true){for(int i=n;i<N;i++){MoveDistance[i-n]=abs(SortOrder[i]-temp);temp=SortOrder[i];FindOrder[i-n]=SortOrder[i];}for(int j=n-1;j>=0;j--){MoveDistance[N-1-j]=abs(SortOrder[j]-temp);temp=SortOrder[j];FindOrder[N-1-j]=SortOrder[j];}}else{for(int i=n-1;i>=0;i--){MoveDistance[N-i-4]=abs(SortOrder[i]-temp);temp=SortOrder[i];FindOrder[N-i-4]=SortOrder[i];}for(int j=n;j<N;j++){MoveDistance[j]=abs(SortOrder[j]-temp);temp=TrackOrder[j];FindOrder[j]=SortOrder[j];}}}//=================CSCAN,循环扫描算法======================= void CSCAN(){int m,n,temp;temp=BeginNum;Sort();cout<<"请选择开始方向:1--向外;0---向里: ";cin>>m;if(m==1)direction=true;else if(m==0)direction=false;elsecout<<"输入错误!";for(int i=0;i<N;i++){if(SortOrder[i]<BeginNum)continue;else{n=i;break;}}if(direction==true){for(int i=n;i<N;i++){MoveDistance[i-n]=abs(SortOrder[i]-temp);temp=SortOrder[i];FindOrder[i-n]=SortOrder[i];}for(int j=0;j<n;j++){MoveDistance[N-n+j]=abs(SortOrder[j]-temp);temp=SortOrder[j];FindOrder[N-n+j]=SortOrder[j];}}else{for(int i=n-1;i>=0;i--){MoveDistance[n-1-i]=abs(SortOrder[i]-temp);temp=SortOrder[i];FindOrder[n-1-i]=SortOrder[i];}for(int j=N-1;j>=n;j--){MoveDistance[N-j+n-1]=abs(SortOrder[j]-temp);temp=SortOrder[j];FindOrder[N-j+n-1]=SortOrder[j];}}}//========计算平均寻道时间==============void Count(){int Total=0;for(int i=0;i<N;i++){Total+=MoveDistance[i];}AverageDistance=((double)Total)/((double)N);}void Show(){cout<<setw(20)<<"被访问的下一个磁道号"<<setw(20)<<"移动距离(磁道数)"<<endl;for(int i=0;i<N;i++){cout<<setw(15)<<FindOrder[i]<<setw(15)<<MoveDistance[i]<<endl;}cout<<setw(20)<<"平均寻道长度:"<<AverageDistance<<endl;cout<<endl;}int main(){int y=1;int s;Inith();while(y){cout<<"请选择寻道方式:1--FCFS; 2--SSTF; 3--SCAN;4--CSCSN: ";cin>>s;switch(s){case 1:FCFS();Count();Show();break;case 2:SSTF();Count();Show();break;case 3:SCAN();Count();Show();break;case 4:CSCAN();Count();Show();break;}cout<<"是否继续选择寻道算法1--是;0--否: ";int p;cin>>p;y=p;}exit;return 0;}结果截图:。