操作系统实验报告61025111017陈绪群.docx
- 文档编号:12682742
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:19
- 大小:58.43KB
操作系统实验报告61025111017陈绪群.docx
《操作系统实验报告61025111017陈绪群.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告61025111017陈绪群.docx(19页珍藏版)》请在冰豆网上搜索。
操作系统实验报告61025111017陈绪群
实验六磁盘调度算法
学号:
1025111017姓名:
陈绪群任课老师:
骆翔宇
(华侨大学计算机科学与技术学院10网络工程二班)
1.算法思想
(1)问题描述:
设计程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法的工作过程。
假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。
(2)算法思想:
1.先来先服务FCFS算法思想
这是一种最简单的磁盘调度算法。
它根据进程请求访问磁盘的先后次序进行调度。
此算法的优点是公平、简单,且每个进程的请求都能依次地得到处理,不会出现某一进程的请求长期得不到满足的情况。
但此算法由于未对寻道进行优化,致使平均寻道时间可能较长。
2.最短寻道时间优先SSTF算法思想
该算法选择这样的进程:
其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。
但这种算法不能保证平均寻道时间最短。
3.SCAN算法思想
该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。
例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。
这样自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。
这时,同样也是每次选择这样的进程来调度,即要访问的磁道在当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现象。
4.循环SCAN算法思想
CSCAN算法规定磁头单向移动,例如,只是自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问的磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。
2.程序代码
#include
#include
#include
#include
#include
#include
usingnamespacestd;
intFCFS(vector
voidresult_print(vector
intSSTF(vector
boolisAllVisited(vector
intgetMinIndex(vector
vector
intSCAN(vector
voidSCAN_min(vector
vector
intgetmaxIndex(vector
intgetminIndex(vector
intCSCAN(vector
intmain(){
intm;//开始磁盘号
intn;//磁道个数
intDirector;//磁道移动方向
inti,witch;
freopen("test.txt","r",stdin);//文件重定向
cout<<"输入磁道个数n:
";//初始化
cin>>n;
cout< cout<<"输入开始磁盘号m: "; cin>>m; cout< vector cout<<"磁盘访问序列: "; for(i=0;i cin>>TrackOrder[i]; cout< } cout< cout<<"算法选择说明: "< cout< cout<<"磁头移动方向说明: "< cout< cout<<"请输入算法选择witch: ";//算法选择 while(cin>>witch){ cout< switch(witch){ case1: FCFS(TrackOrder,n,m);//FCFS cout<<"请输入算法选择witch: "; break; case2: SSTF(TrackOrder,n,m);//SSTF cout<<"请输入算法选择witch: "; break; case3: cout<<"输入磁头移动方向: ";//SCAN cin>>Director; cout< SCAN(TrackOrder,n,m,Director); cout<<"请输入算法选择witch: "; break; case4: cout<<"输入磁头移动方向: ";//CSCAN cin>>Director; cout< CSCAN(TrackOrder,n,m,Director); cout<<"请输入算法选择witch: "; break; case-1: cout<<"即将退出程序...."< return0; default: cout<<"输入出错,请重新输入所要选择的算法: "; break; } } return0; } //====================================================FCFS========================================== intFCFS(vector intcurrentTrack=m,i;//当前磁道 doubleaveDis=0; vector for(i=0;i Distance[i]=abs(currentTrack-TrackOrder[i]); currentTrack=TrackOrder[i]; aveDis+=(1.0*Distance[i])/n; } cout<<"FCFS结果输出: "< result_print(TrackOrder,Distance,aveDis); cout< return0; } //====================================================结果输出========================================== voidresult_print(vector inti,size=Distance.size(); cout<<"被访问的下一个磁道号: ";//输出下一个被访问磁道号序列 for(i=0;i cout< } cout<<"\n移动距离: ";//对应的移动距离 for(i=0;i cout< } cout< "< } //====================================================SSTF========================================== intSSTF(vector intcurrentTrack=m,i,index;//当前磁道 doubleaveDis=0; vector vector vector for(i=0;i if(isAllVisited(visited)==false){ index=getMinIndex(TrackOrder,currentTrack,visited,Distance); visitIndex.push_back(index); } } //结果输出 cout<<"SSTF结果输出: \n被访问的下一个磁道号: ";//输出下一个被访问磁道号序列 for(i=0;i cout< } cout<<"\n移动距离: "; for(i=0;i cout< aveDis+=(1.0*Distance[i])/n; } cout< "< return0; } //===========================================判断是否所有的序列已经被访问=================================== boolisAllVisited(vector inti,size=visited.size(); for(i=0;i if(visited[i]==false) returnfalse; } returntrue; } //====================================================找最近磁道号========================================== intgetMinIndex(vector inti,size=TrackOrder.size(); inttemp; intmin,minDis; for(i=0;i if(visited[i]==false){ min=i; minDis=abs(currentTrack-TrackOrder[i]); break; } } for(i=0;i if(visited[i]==false){ temp=abs(currentTrack-TrackOrder[i]); if(temp min=i; minDis=temp; } } } Distance[min]=abs(currentTrack-TrackOrder[min]); currentTrack=TrackOrder[min]; visited[min]=true; returnmin; } //====================================================SCAN======================================= intSCAN(vector intcurrentTrack=m,i;//当前磁道 doubleaveDis=0; vector vector vector switch(Director){ case1: for(i=0;i SCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'>'); } for(i=0;i SCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'<'); } break; case2: for(i=0;i SCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'<'); } for(i=0;i SCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'>'); } break; default: cout<<"磁盘移动方向不正确...."; return1; } //结果输出 cout<<"SCAN结果输出: \n被访问的下一个磁道号: "; for(i=0;i cout< } cout<<"\n移动距离: "; for(i=0;i cout< aveDis+=(1.0*Distance[i])/n; } cout< "< return0; } //=============================================SCAN根据移动方向获取结果========================================== voidSCAN_min(vector vector inti,size=TrackOrder.size(); intmin=-1,minTrack,temp; for(i=0;i if(visited[i]==false){ switch(ch){ case'>': if(TrackOrder[i]>currentTrack){ min=i; minTrack=TrackOrder[i]; } break; case'<': if(TrackOrder[i] min=i; minTrack=TrackOrder[i]; } break; } } } if(min! =-1){ intminDis=abs(currentTrack-TrackOrder[min]); //找最近的磁道 for(i=0;i if(visited[i]==false){ switch(ch){ case'>': if(TrackOrder[i]>currentTrack){ temp=abs(currentTrack-TrackOrder[i]); if(temp min=i; minTrack=TrackOrder[i]; minDis=temp; } } break; case'<': if(TrackOrder[i] temp=abs(currentTrack-TrackOrder[i]); if(temp min=i; minTrack=TrackOrder[i]; minDis=temp; } } break; } } } nextTrack.push_back(minTrack); visited[min]=true; Distance.push_back(abs(currentTrack-minTrack)); currentTrack=minTrack; } } //==================================CSCAN============================================ intCSCAN(vector intcurrentTrack=m,i;//当前磁道 doubleaveDis=0; intindex; vector vector vector switch(Director){ case1: for(i=0;i SCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'>'); } //移动磁头 index=getminIndex(TrackOrder,visited,currentTrack); cout< if(index! =-1){ nextTrack.push_back(TrackOrder[index]); Distance.push_back(abs(currentTrack-TrackOrder[index])); currentTrack=TrackOrder[index]; visited[index]=true; for(i=0;i SCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'>'); } } break; case2: for(i=0;i SCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'<'); } //移动磁头 index=getmaxIndex(TrackOrder,visited,currentTrack); if(index! =-1){ nextTrack.push_back(TrackOrder[index]); Distance.push_back(abs(currentTrack-TrackOrder[index])); currentTrack=TrackOrder[index]; visited[index]=true; for(i=0;i SCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'<'); } } break; default: c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 61025111017 陈绪群
![提示](https://static.bdocx.com/images/bang_tan.gif)