操作系统实验报告61025111017陈绪群.docx

上传人:b****5 文档编号:12682742 上传时间:2023-04-21 格式:DOCX 页数:19 大小:58.43KB
下载 相关 举报
操作系统实验报告61025111017陈绪群.docx_第1页
第1页 / 共19页
操作系统实验报告61025111017陈绪群.docx_第2页
第2页 / 共19页
操作系统实验报告61025111017陈绪群.docx_第3页
第3页 / 共19页
操作系统实验报告61025111017陈绪群.docx_第4页
第4页 / 共19页
操作系统实验报告61025111017陈绪群.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

操作系统实验报告61025111017陈绪群.docx

《操作系统实验报告61025111017陈绪群.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告61025111017陈绪群.docx(19页珍藏版)》请在冰豆网上搜索。

操作系统实验报告61025111017陈绪群.docx

操作系统实验报告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;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&TrackOrder,intn,intm){

intcurrentTrack=m,i;//当前磁道

doubleaveDis=0;

vectorDistance(n);

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&TrackOrder,vector&Distance,double&aveDis){

inti,size=Distance.size();

cout<<"被访问的下一个磁道号:

";//输出下一个被访问磁道号序列

for(i=0;i

cout<

}

cout<<"\n移动距离:

";//对应的移动距离

for(i=0;i

cout<

}

cout<

"<

}

//====================================================SSTF==========================================

intSSTF(vector&TrackOrder,intn,intm){

intcurrentTrack=m,i,index;//当前磁道

doubleaveDis=0;

vectorDistance(n);//移动距离

vectorvisitIndex;//被访问磁道号的索引

vectorvisited(n,false);//是否被访问

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&visited){

inti,size=visited.size();

for(i=0;i

if(visited[i]==false)

returnfalse;

}

returntrue;

}

//====================================================找最近磁道号==========================================

intgetMinIndex(vector&TrackOrder,int¤tTrack,vector&visited,vector&Distance){

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&TrackOrder,intn,intm,intDirector){

intcurrentTrack=m,i;//当前磁道

doubleaveDis=0;

vectorDistance;//移动距离

vectorvisited(n,false);

vectornextTrack;

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&TrackOrder,vector&Distance,vector&nextTrack,

vector&visited,int¤tTrack,charch){

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&TrackOrder,intn,intm,intDirector){

intcurrentTrack=m,i;//当前磁道

doubleaveDis=0;

intindex;

vectorDistance;//移动距离

vectorvisited(n,false);

vectornextTrack;

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1