实验六--磁盘调度算法_第1页
实验六--磁盘调度算法_第2页
实验六--磁盘调度算法_第3页
实验六--磁盘调度算法_第4页
实验六--磁盘调度算法_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上实验六 磁盘调度算法【实验目的】 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的实现方法。【实验内容】问题描述:设计程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。程序要求如下:1)利用先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法模拟磁道

2、访问过程。2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。4)输出:每种算法的平均寻道长度。【实验代码】#include <iostream>#include <fstream>#include <iomanip>#include <stdio.h>using namespace std;const int MaxNumber=100;int TrackOrderM

3、axNumber;/磁盘访问序列int MoveDistanceMaxNumber;/磁头每次移动的距离double AverageDistance;/平均寻道长度bool direction;/SCAN和CSCAN算法的磁头移动方向int M;/开始磁道号int N;/磁道个数void inputData()cout<<"请输入磁道个数N: "cin>>N; cout<<"n请输入磁盘访问顺序(此部分由文件读入)。"<<endl;fstream fin("F:/TrackOrder3.txt&q

4、uot;); for(int i=0;i<N;i+)fin>>TrackOrderi;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+)c

5、out<<TrackOrderi<<" "cout<<endl;void FCFS()int i,j;int sum=0;float avg;int FcfsMaxNumber;int sumArrayMaxNumber;for(i=0;i<N;i+)Fcfsi=TrackOrderi;/sum=0;sumArray0=abs(M-Fcfs0);/cout<<"FCFS磁盘调度算法:"<<endl;cout<<"n从"<<M<<&qu

6、ot;号磁道开始"<<endl;cout<<"被访问的下一个磁道号: "for(i=0;i<N;i+)cout<<Fcfsi<<" "cout<<endl;cout<<"对应移动距离(磁道数): "<<sumArray0<<" "for(i=0,j=1;j<N;i+,j+)sumArrayj=abs(Fcfsj-Fcfsi); cout<<sumArrayj<<"

7、"for(i=0;i<N;i+)sum=sum+sumArrayi;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 SstfMaxNumber;int sumArrayMa

8、xNumber;int Mnow;Mnow=M;for(i=0;i<N;i+)Sstfi=TrackOrderi;/sum=0;/sumArray0=abs(M-Fcfs0);for(i=0;i<N;i+)for(j=i+1;j<N;j+) if(Sstfi>Sstfj)/将磁道号从小到大排序temp=Sstfi;Sstfi=Sstfj;Sstfj=temp;/cout<<"SSTF磁盘调度算法:"<<endl;cout<<"n从"<<Mnow<<"号磁道开始&

9、quot;<<endl;cout<<"被访问的下一个磁道号: "if(SstfN-1<=Mnow)/若被访问的下一个最大的磁道号不大于当前的磁道号for(i=N-1,s=0;i>=0;i-,s+)cout<<Sstfi<<" "sumArrays=Mnow-Sstfi;sum+=Mnow-Sstfi;Mnow=Sstfi;elseif(Sstf0>=Mnow)for(i=0,s=0;i<N;i+,s+)cout<<Sstfi<<" "sum

10、Arrays=Sstfi-Mnow;sum+=Sstfi-Mnow;Mnow=Sstfi;elsewhile(Sstfk<Mnow)k+;l=k-1;r=k;if(Mnow-Sstfl<=(Sstfr-Mnow)while(l>=0)cout<<Sstfl<<" "sumArrays=Mnow-Sstfl; s=s+1;sum=sum+Mnow-Sstfl;Mnow=Sstfl;l=l-1;Mnow=Sstf0;for(j=r;j<N;j+)cout<<Sstfj<<" "sumAr

11、rays=Sstfj-Mnow;s=s+1; sum+=Sstfj-Mnow;Mnow=Sstfj;elsewhile(r<N)cout<<Sstfr<<" "sumArrays=Sstfr-Mnow;s=s+1; sum+=Sstfr-Mnow;Mnow=Sstfr;r=r+1;Mnow=SstfN-1;for(j=1;j>=0;j-)cout<<Sstfj<<" "sumArrays=Mnow-Sstfj;s=s+1;sum+=Mnow-Sstfj;Mnow=Sstfj;cout<&l

12、t;endl;cout<<"对应移动距离(磁道数): "for(i=0;i<N;i+) cout<<sumArrayi<<" "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

13、;int c,l,r;int sum=0;float avg=0;int ScanMaxNumber;int sumArrayMaxNumber;int Mnow;Mnow=M;for(i=0;i<N;i+)Scani=TrackOrderi;for(i=0;i<N;i+)for(j=i+1;j<N;j+)if(Scani>Scanj)temp=Scani;Scani=Scanj;Scanj=temp; cout<<"请选择磁头移动方向1-增加方向、0-减小方向: "cin>>c;/cout<<endl;/cout

14、<<"SCAN磁盘调度算法:"<<endl;cout<<"n从"<<M<<"号磁道开始"<<endl;cout<<"被访问的下一个磁道号: "if(ScanN-1<=Mnow)for(i=N-1,s=0;i>=0;i-,s+)cout<<Scani<<" "sumArrays=Mnow-Scani;sum+=Mnow-Scani;Mnow=Scani;elseif(Scan0&

15、gt;=Mnow)for(i=0,s=0;i<N;i+,s+)cout<<Scani<<" "sumArrays=Scani-Mnow;sum+=Scani-Mnow;Mnow=Scani;elsewhile(Scank<Mnow)k+;l=k-1;r=k;switch(c) case 0:while(l>=0)cout<<Scanl<<" "sumArrays=Mnow-Scanl; s=s+1;sum=sum+Mnow-Scanl;Mnow=Scanl;l=l-1;Mnow=Scan0

16、;for(j=r;j<N;j+)cout<<Scanj<<" "sumArrays=Scanj-Mnow; s=s+1;sum+=Scanj-Mnow;Mnow=Scanj;break; case 1:while(r<N)cout<<Scanr<<" "/这一步没错sumArrays=Scanr-Mnow; s=s+1;sum+=Scanr-Mnow;Mnow=Scanr;r=r+1;Mnow=ScanN-1;for(j=l;j>=0;j-)cout<<Scanj<<

17、;" "/这一步也没错sumArrays=Mnow-Scanj; s=s+1;sum+=Mnow-Scanj;Mnow=Scanj;break;default:cout<<"输入有误,请重新输入. "/goto cout<<endl;cout<<"对应移动距离(磁道数): "for(i=0;i<N;i+) cout<<sumArrayi<<" " avg=(float)sum/N;cout<<"n总寻道长度:"<

18、<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 CscanMaxNumber;int sumArrayMaxNumber;Mnow=M;for(i=0;i<N;i+)Cscani=TrackOrderi;for(i=0;i<N;i+)for(j=i+1;j<N;

19、j+)if(Cscani>Cscanj)temp=Cscani; Cscani=Cscanj;Cscanj=temp;cout<<"n请选择磁头移动方向1-增加方向、0-减小方向: "cin>>c;/cout<<endl;/cout<<"CSCAN磁盘调度算法:"<<endl;cout<<"从"<<M<<"号磁道开始"<<endl;cout<<"被访问的下一个磁道号: "

20、 if(CscanN-1<=Mnow)for(i=0,s=0;i<N;i+,s+)cout<<Cscani<<" " /sumArrays=Mnow-Cscan0+CscanN-1; sum=Mnow-Cscan0+CscanN-1;elseif(Cscan0>=Mnow)for(i=0,s=0;i<N;i+,s+)cout<<Cscani<<" "/sumArrays=Scani-Mnow; sum=CscanN-1-Mnow;elsewhile(Cscank<Mnow)k+

21、;l=k-1;r=k;switch(c) case 0:for(j=l;j>=0;j-)cout<<Cscanj<<" "for(j=N-1;j>=r;j-)cout<<Cscanj<<" "sum=2*(CscanN-1-Cscan0)-Cscanr+Mnow;break;case 1: for(j=r;j<N;j+)cout<<Cscanj<<" "for(j=0;j<r;j+)cout<<Cscanj<<&qu

22、ot; "sum=2*(CscanN-1-Cscan0)+Cscanr-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=虚拟内存页面配置算法=nn"inputData();show

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论