05操作系统实验磁盘管理实验.docx
- 文档编号:11037481
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:21
- 大小:615.14KB
05操作系统实验磁盘管理实验.docx
《05操作系统实验磁盘管理实验.docx》由会员分享,可在线阅读,更多相关《05操作系统实验磁盘管理实验.docx(21页珍藏版)》请在冰豆网上搜索。
05操作系统实验磁盘管理实验
广州大学学生实验报告
开课学院及实验室:
计算机科学与工程实验室2015年12月1日
实验课程名称
操作系统
成绩
实验项目名称
文件管理实验
指导老师
陈康民
(***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***)
一、实验目的
要求模拟先来先服务法(First-Come,First-Served,FCFS),最短寻道时间优先法(ShortestSeekTimeFirst,SSTF),电梯法(SCAN),循环扫描算法(CSCAN)四种磁盘调度算法,输入为一组请求访问磁道序列,输出为每种调度算法的磁头移动轨迹和移动的总磁道数。
二、实验内容
编程序实现下述磁盘调度算法,并求出每种算法的平均寻道长度:
1、先来先服务算法(FCFS)
2、最短寻道时间优先算法(SSTF)
3、扫描算法(SCAN)
4、循环扫描算法(CSCAN)
三、实验设备
带Linux操作系统的电脑一台。
四、实验过程原始数据记录
实验代码:
#include
#include
#include
#include
usingnamespacestd;
constintMaxNumber=100;
intTrackOrder[MaxNumber];//磁盘访问序列
intMoveDistance[MaxNumber];//磁头每次移动的距离
doubleAverageDistance;//平均寻道长度
booldirection;//SCAN和CSCAN算法的磁头移动方向
intM;//开始磁道号
intN;//磁道个数
voidinputData()
{
cout<<"请输入磁道个数N:
";
cin>>N;
cout<<"\n请输入磁盘访问顺序(此部分由文件读入)。
"< fstreamfin("F: //磁盘调度文件.txt"); for(inti=0;i fin>>TrackOrder[i]; cout<<"\n请输入开始磁盘号M: "; cin>>M; } voidshowData() { cout<<"\n===============================显示配置信息=============================\n"; cout<<"\n输入磁道个数N为: "< "< cout<<"\n磁盘访问序列为: "; for(inti=0;i cout< cout< } voidFCFS() { inti,j; intsum=0; floatavg; intFcfs[MaxNumber]; intsumArray[MaxNumber]; for(i=0;i Fcfs[i]=TrackOrder[i]; //sum=0; sumArray[0]=abs(M-Fcfs[0]); //cout<<"FCFS磁盘调度算法: "< cout<<"\n从"< cout<<"被访问的下一个磁道号: "; for(i=0;i cout< cout< cout<<"对应移动距离(磁道数): "< for(i=0,j=1;j { sumArray[j]=abs(Fcfs[j]-Fcfs[i]); cout< } for(i=0;i sum=sum+sumArray[i]; avg=(float)sum/N; cout<<"\n总寻道长度: "< cout<<"\n平均寻道长度: "< } voidSSTF() { inti,j; intk=1; ints=0; inttemp; intl,r; intsum=0; floatavg=0; intSstf[MaxNumber]; intsumArray[MaxNumber]; intMnow; Mnow=M; for(i=0;i Sstf[i]=TrackOrder[i]; //sum=0; //sumArray[0]=abs(M-Fcfs[0]); for(i=0;i { for(j=i+1;j { if(Sstf[i]>Sstf[j])//将磁道号从小到大排序 { temp=Sstf[i]; Sstf[i]=Sstf[j]; Sstf[j]=temp; } } } //cout<<"SSTF磁盘调度算法: "< cout<<"\n从"< cout<<"被访问的下一个磁道号: "; if(Sstf[N-1]<=Mnow)//若被访问的下一个最大的磁道号不大于当前的磁道号 { for(i=N-1,s=0;i>=0;i--,s++) { cout< sumArray[s]=Mnow-Sstf[i]; sum+=Mnow-Sstf[i]; Mnow=Sstf[i]; } } else { if(Sstf[0]>=Mnow) { for(i=0,s=0;i { cout< sumArray[s]=Sstf[i]-Mnow; sum+=Sstf[i]-Mnow; Mnow=Sstf[i]; } } else { while(Sstf[k] { k++; } l=k-1; r=k; if(Mnow-Sstf[l]<=(Sstf[r]-Mnow)) { while(l>=0) { cout< 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 { cout< sumArray[s]=Sstf[j]-Mnow; s=s+1; sum+=Sstf[j]-Mnow; Mnow=Sstf[j]; } } else { while(r { cout< 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< sumArray[s]=Mnow-Sstf[j]; s=s+1; sum+=Mnow-Sstf[j]; Mnow=Sstf[j]; } } } } cout< cout<<"对应移动距离(磁道数): "; for(i=0;i { cout< } avg=(float)sum/N; cout<<"\n总寻道长度: "< cout<<"\n平均寻道长度: "< } 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;i Scan[i]=TrackOrder[i]; for(i=0;i { for(j=i+1;j { if(Scan[i]>Scan[j]) { temp=Scan[i]; Scan[i]=Scan[j]; Scan[j]=temp; } } } cout<<"请选择磁头移动方向[1-增加方向、0-减小方向]: "; cin>>c; //cout< //cout<<"SCAN磁盘调度算法: "< cout<<"\n从"< cout<<"被访问的下一个磁道号: "; if(Scan[N-1]<=Mnow) { for(i=N-1,s=0;i>=0;i--,s++) { cout< sumArray[s]=Mnow-Scan[i]; sum+=Mnow-Scan[i]; Mnow=Scan[i]; } } else { if(Scan[0]>=Mnow) { for(i=0,s=0;i { cout< sumArray[s]=Scan[i]-Mnow; sum+=Scan[i]-Mnow; Mnow=Scan[i]; } } else { while(Scan[k] { k++; } l=k-1; r=k; switch(c) { case0: { while(l>=0) { cout< 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 { cout< sumArray[s]=Scan[j]-Mnow; s=s+1; sum+=Scan[j]-Mnow; Mnow=Scan[j]; } break; } case1: { while(r { cout< 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< sumArray[s]=Mnow-Scan[j]; s=s+1; sum+=Mnow-Scan[j]; Mnow=Scan[j]; } break; } default: cout<<"输入有误,请重新输入."; //goto } } } cout< cout<<"对应移动距离(磁道数): "; for(i=0;i { cout< } avg=(float)sum/N; cout<<"\n总寻道长度: "< cout<<"\n平均寻道长度: "< } voidCSCAN() { inttemp; intk=1; ints; intMnow,l,r,c; inti,j; intsum=0; floatavg=0; intCscan[MaxNumber]; intsumArray[MaxNumber]; Mnow=M; for(i=0;i Cscan[i]=TrackOrder[i]; for(i=0;i { for(j=i+1;j { if(Cscan[i]>Cscan[j]) { temp=Cscan[i]; Cscan[i]=Cscan[j]; Cscan[j]=temp; } } } cout<<"\n请选择磁头移动方向[1-增加方向、0-减小方向]: "; cin>>c; //cout< //cout<<"CSCAN磁盘调度算法: "< cout<<"从"< cout<<"被访问的下一个磁道号: "; if(Cscan[N-1]<=Mnow) { for(i=0,s=0;i { cout< //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 { cout< //sumArray[s]=Scan[i]-Mnow;sum=Cscan[N-1]-Mnow; } } else { while(Cscan[k] { k++; } l=k-1; r=k; switch(c) { case0: { for(j=l;j>=0;j--) cout< for(j=N-1;j>=r;j--) cout< sum=2*(Cscan[N-1]-Cscan[0])-Cscan[r]+Mnow; break; } case1: { for(j=r;j cout< for(j=0;j cout< sum=2*(Cscan[N-1]-Cscan[0])+Cscan[r-1]-Mnow; break; } default: cout<<"输入有误,请重新输入."; } } } avg=(float)sum/N; cout<<"\n总寻道长度: "< cout<<"\n平均寻道长度: "< } intmain() { charchoice; cout<<"\n===========================虚拟内存页面配置算法=========================\n\n"; inputData(); showData(); cout< 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< break; case'2': cout<<"\nSSTF磁盘调度算法==>"; SSTF(); //cout< break; case'3': cout<<"\nSCAN磁盘调度算法==>"; SCAN(); //cout< break; case'4': cout<<"\nCSCAN磁盘调度算法==>"; CSCAN(); //cout< break; default: return1; } } cin>>choice; getchar(); return1; } 图1 图2 图3 图4 五、实验结果分析 实验结果: 如图1~4所示,创建一个c文件,使用g++编译器编译并执行程序后,成功运行程序并且按照提示输入功能,即可以计算不同的磁盘调度算法的输出结果。 结果分析: 1通过模拟常见的几种磁盘寻道算法,通过计算平均寻道的长度,我们可以很直观的了解到不同寻道算法的效率,以加深对FCFS、最短寻道时间以及电梯等磁盘调度算法的理解。 让我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解。 2下面客观分析实验模拟的常见寻道算法的效率: a.先来先服务(FCFS算法) 这是一个简单的磁盘调度算法。 它根据进程请求访问磁盘的先后次序进行调度。 此算法的优点是公平简单,这个算法虽然简单自然,但是由于未对寻道进行优化,致使平均寻道时间可能较长。 b.最短寻道时间优化(SSTF算法) 该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道最近,以使每次的寻道时间最短,但这种调度算法却不能保证平均寻道时间最短。 c.扫描算法(SCAN算法) SCAN算法不是考虑到欲访问的磁道与当前磁头的距离,而是优先考虑的是磁头当前移动的方向。 比如说,当磁头正在自里向外移动时,SCAN算法所选择的下一个访问对象应该是其余访问的磁道即在当前磁道之外,有是距离最近的。 这样自里向外的访问,直到再无更外的磁道需要访问才将磁臂换向,自外向里移动。 由于这种算法中磁头移动的规律颇似电梯的运行,故而又称为电梯调度算法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 05 操作系统 实验 磁盘 管理