操作系统实验报告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&TrackOrder,intn,intm);//先来先服务
voidresult_print(vector&TrackOrder,vector&Distance,double&aveDis);//结果输出
intSSTF(vector&TrackOrder,intn,intm);//SSTF
boolisAllVisited(vector&visited);//判断是否所有的序列已经被访问
intgetMinIndex(vector&TrackOrder,int¤tTrack,//获取磁道号最小磁道的索引
vector&visited,vector&Distance);
intSCAN(vector&TrackOrder,intn,intm,intDirector);//SCAN
voidSCAN_min(vector&TrackOrder,vector&Distance,vector&nextTrack,//根据方向所做得操作,操作根据ch来选择
vector&visited,int¤tTrack,charch);
intgetmaxIndex(vector&TrackOrder,vector&visited,intcurrentTrack);//获取未访问的序列中磁道号最大的索引值
intgetminIndex(vector&TrackOrder,vector&visited,intcurrentTrack);//获取未访问的序列中磁道号最小的索引值
intCSCAN(vector&TrackOrder,intn,intm,intDirector);//CSCAN
intmain(){
intm;//开始磁盘号
intn;//磁道个数
intDirector;//磁道移动方向
inti,witch;
freopen("test.txt","r",stdin);//文件重定向
cout<<"输入磁道个数n:
";//初始化
cin>>n;
cout<cout<<"输入开始磁盘号m:
";
cin>>m;
cout<vectorTrackOrder(n,-1);//磁盘访问序列
cout<<"磁盘访问序列:
";
for(i=0;icin>>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&TrackOrder,intn,intm){
intcurrentTrack=m,i;//当前磁道
doubleaveDis=0;
vectorDistance(n);
for(i=0;iDistance[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&TrackOrder,vector&Distance,double&aveDis){
inti,size=Distance.size();
cout<<"被访问的下一个磁道号:
";//输出下一个被访问磁道号序列
for(i=0;icout<}
cout<<"\n移动距离:
";//对应的移动距离
for(i=0;icout<}
cout<"<}
//====================================================SSTF==========================================
intSSTF(vector&TrackOrder,intn,intm){
intcurrentTrack=m,i,index;//当前磁道
doubleaveDis=0;
vectorDistance(n);//移动距离
vectorvisitIndex;//被访问磁道号的索引
vectorvisited(n,false);//是否被访问
for(i=0;iif(isAllVisited(visited)==false){
index=getMinIndex(TrackOrder,currentTrack,visited,Distance);
visitIndex.push_back(index);
}
}
//结果输出
cout<<"SSTF结果输出:
\n被访问的下一个磁道号:
";//输出下一个被访问磁道号序列
for(i=0;icout<}
cout<<"\n移动距离:
";
for(i=0;icout<aveDis+=(1.0*Distance[i])/n;
}
cout<"<return0;
}
//===========================================判断是否所有的序列已经被访问===================================
boolisAllVisited(vector&visited){
inti,size=visited.size();
for(i=0;iif(visited[i]==false)
returnfalse;
}
returntrue;
}
//====================================================找最近磁道号==========================================
intgetMinIndex(vector&TrackOrder,int¤tTrack,vector&visited,vector&Distance){
inti,size=TrackOrder.size();
inttemp;
intmin,minDis;
for(i=0;iif(visited[i]==false){
min=i;
minDis=abs(currentTrack-TrackOrder[i]);
break;
}
}
for(i=0;iif(visited[i]==false){
temp=abs(currentTrack-TrackOrder[i]);
if(tempmin=i;
minDis=temp;
}
}
}
Distance[min]=abs(currentTrack-TrackOrder[min]);
currentTrack=TrackOrder[min];
visited[min]=true;
returnmin;
}
//====================================================SCAN=======================================
intSCAN(vector&TrackOrder,intn,intm,intDirector){
intcurrentTrack=m,i;//当前磁道
doubleaveDis=0;
vectorDistance;//移动距离
vectorvisited(n,false);
vectornextTrack;
switch(Director){
case1:
for(i=0;iSCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'>');
}
for(i=0;iSCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'<');
}
break;
case2:
for(i=0;iSCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'<');
}
for(i=0;iSCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'>');
}
break;
default:
cout<<"磁盘移动方向不正确....";
return1;
}
//结果输出
cout<<"SCAN结果输出:
\n被访问的下一个磁道号:
";
for(i=0;icout<}
cout<<"\n移动距离:
";
for(i=0;icout<aveDis+=(1.0*Distance[i])/n;
}
cout<"<return0;
}
//=============================================SCAN根据移动方向获取结果==========================================
voidSCAN_min(vector&TrackOrder,vector&Distance,vector&nextTrack,
vector&visited,int¤tTrack,charch){
inti,size=TrackOrder.size();
intmin=-1,minTrack,temp;
for(i=0;iif(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;iif(visited[i]==false){
switch(ch){
case'>':
if(TrackOrder[i]>currentTrack){
temp=abs(currentTrack-TrackOrder[i]);
if(tempmin=i;
minTrack=TrackOrder[i];
minDis=temp;
}
}
break;
case'<':
if(TrackOrder[i]temp=abs(currentTrack-TrackOrder[i]);
if(tempmin=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&TrackOrder,intn,intm,intDirector){
intcurrentTrack=m,i;//当前磁道
doubleaveDis=0;
intindex;
vectorDistance;//移动距离
vectorvisited(n,false);
vectornextTrack;
switch(Director){
case1:
for(i=0;iSCAN_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;iSCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'>');
}
}
break;
case2:
for(i=0;iSCAN_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;iSCAN_min(TrackOrder,Distance,nextTrack,visited,currentTrack,'<');
}
}
break;
default:
c