人和以吟实验报告学院(系)名称:计算机与通信工程学院【实验过程记录(源程序、测试用例、测试结果及心得体会等) 】#include<iostream> #include<iomanip> #include<math.h> using namespace std;void Inith(){cout<<" 请输入磁道数: "; cin>>M;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(intj=0;j<i;j++) {if(SortOrder[j]>SortOrder[j+1])const int MaxNumber=100; int TrackOrder[MaxNumber];int MoveDistance[MaxNumber]; // ------- int FindOrder[MaxNumber]; // ---------- double AverageDistance; // ----------- bool direction; // int BeginNum; //int M; // int N;//int SortOrder[MaxNumber]; // ------ bool Finished[MaxNumber];移动距离 ; 寻好序列。
平均寻道长度方向 true 时为向外, false 开始磁道号。
磁道数。
提出磁盘 I/O 申请的进程数 排序后的序列为向里temp=SortOrder[j];SortOrder[j]=SortOrder[j+1];SortOrder[j+1]=temp;//============FCFS, 先来先服务 =================================void FCFS(){int temp;temp=BeginNum; // ---- 将BeginNum赋给temp作为寻道时的当前所在磁道号for(int i=0;i<N;i++){MoveDistance[i]=abs(TrackOrder[i]-temp); // ---- 计算移动磁道数temp=TrackOrder[i]; // --- 寻到后,将此道作为当前所在磁道号,赋给 tempFindOrder[i]=TrackOrder[i]; // - 寻好的赋给寻好序列}}//========SSTF, 最短寻道法 =============================void SSTF(){int temp,n;int A=M;temp=BeginNum; // ---- 将BeginNum赋给temp作为寻道时的当前所在磁道号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; //将已经寻找到的Finished 赋值为true 寻道长度当前寻道号。
重置A值}〃=====================SCA N 扫描算法========== 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];}}}〃=================CSCA N 循环扫描算法======================= 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<<"================从"<<BeginNum<<"号磁道开始: cout<<setw(20)<<" 被访问的下一个磁道号 "<<setw(20)<<" 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;==================="<<endl; 移动距离 ( 磁道数 )"<<endl;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-- 是; 2-- 否"; int p; cin>>p; y=p;}return 0;}实验结果 :FCFS方式:Sstf 方式:是否继绒选採寻道算法? 1—是;2-^1请选择寻道方武’ 1—FCFS; 2—SSTF : 3 —SCAJI : 4—CSCSN; 2 ========丛*号磁逍开始 被访冋的下一个磁道号322727 27 27 6 276平均寻适长度5 83333SCAN 方 式:移动距离(诫道数) 6 5 6 6请选择寻道方式:一 1—FCFS ; 2—関 TF ; 3—ECAM 4--CECSN ; 3 *青选拯弁菇芳向.1--向拆;2——向里1 ================^40 号硯道幵 i4== =================== 被访问的下一个磁道号606569 86 32 27平均寻道长度:17.5否继续选择寻道算法? P->; A 召1情选择寻道方式;1-FCFS; 2-SSTP; 3-SCAN; 4—CSCSN; 3 卜青选摻弃始方向I 1 一向外;0---向里0X™™"™ 工从 40 号磁道开始―================ = 險访问的下一个磁道号6032 60 65 &9 86平均寻道长度:毙.83334.CSCSN移动距离(磁道数) 20 5 4 17 54 5穆动距离(磁道数) 20 8 33 38 17 21。