磁盘调度算法代码 2.docx

上传人:b****8 文档编号:9607857 上传时间:2023-02-05 格式:DOCX 页数:19 大小:129.52KB
下载 相关 举报
磁盘调度算法代码 2.docx_第1页
第1页 / 共19页
磁盘调度算法代码 2.docx_第2页
第2页 / 共19页
磁盘调度算法代码 2.docx_第3页
第3页 / 共19页
磁盘调度算法代码 2.docx_第4页
第4页 / 共19页
磁盘调度算法代码 2.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

磁盘调度算法代码 2.docx

《磁盘调度算法代码 2.docx》由会员分享,可在线阅读,更多相关《磁盘调度算法代码 2.docx(19页珍藏版)》请在冰豆网上搜索。

磁盘调度算法代码 2.docx

磁盘调度算法代码2

磁盘调度算法

一.需求分析

编译程序运用磁盘的四种调度算法实现对磁盘的调度,四种算法分别为先来先服务(FCFS)算法,最短寻道时间优先(SSTF)算法,扫描调度(SCAN)算法,循环扫描(C-SCAN)算法。

二.总体设计及分类简介

磁盘调度中常用的有四种算法,功能分别如下:

1.先来先服务(FCFS)算法。

即先来的请求先被响应。

FCFS策略看起来似乎是相当"公平"的,但是当请求的频率过高的时候FCFS策略的响应时间就会大大延长。

FCFS策略为我们建立起一个随机访问机制的模型,但是假如用这个策略反复响应从里到外的请求,那么将会消耗大量的时间。

为了尽量降低寻道时间,看来我们需要对等待着的请求进行适当的排序,而不是简单的使用FCFS策略。

这个过程就叫做磁盘调度管理。

有时候FCFS也被看作是最简单的磁盘调度算法。

2.最短寻道时间优先(SSTF)算法。

要求访问的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。

3.扫描调度(SCAN)算法。

该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。

例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道,既在当前磁道之外,又是距离最近的。

这样自里向外的访问,直至再无更外的磁道需要访问时,才将磁道换向自外向里移动。

这时,同样也是每次选择这样的进程来调度,也就是要访问的当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现像。

4.循环扫描(C-SCAN)算法。

当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该里程就必须等待,为了减少这种延迟,CSCAN算法规定磁头单向移动,而本实验过程中我们所设计的是磁头从里向外移动,而从外向里移动时只须改方向而已,本实验未实现。

但本实验已完全能演示循环扫描的全过程。

三.目的

1.熟悉并掌握磁盘管理系统的设计方法,加深对所学各种磁盘调度算法及其算法的特点的了解。

2.掌握磁盘调度的基本概念,比较各种磁盘调度算法的优劣

四.要求

从课程设计的目的出发,通过设计工作的各个环节,达到以下设计要求:

1.对系统进行功能模块分析、控制模块分析正确;

2.系统设计要实用;

3.编程简练,可用,功能全面,具有较好的健壮性;

4.说明书、流程图要清楚。

五.详细设计及算法流程图

1.总流程图

2.先来先服务(FCFS)算法流程图

3.最短寻道时间优先(SSTF)算法流程图

4.扫描调度(SCAN)算法流程图

5.循环扫描(C-SCAN)算法流程图

附录:

修改后的程序:

#include

#include

usingnamespacestd;

voidFCFS(inta[],intn);

voidSSTF(inta[],intn);

voidSCAN(inta[],intn);

voidCSCAN(inta[],intn);

intmain()

{

intn;//磁道的个数

ints;//功能号

cout<<"请输入当前磁道的个数:

"<

cin>>n;

int*a=newint[n];

cout<<"输入磁道号为:

";

for(inti=0;i

{

cin>>a[i];

cout<

}

cout<

while

(1)

{cout<

cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━┓"<

cout<<"┃     磁盘调度算法功能列表   ┃"<

cout<<"┠───────────────────────┨"<

cout<<"┃1、先来先服务算法(FCFS)┃"<

cout<<"┠───────────────────────┨"<

cout<<"┃2、最短寻道时间算法(SSTF)┃"<

cout<<"┠───────────────────────┨"<

cout<<"┃3、扫描算法(SCAN)┃"<

cout<<"┠───────────────────────┨"<

cout<<"┃4、循环扫描算法(CSCAN)┃"<

cout<<"┠───────────────────────┨"<

cout<<"┃0、退出┃"<

cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━┛"<

cout<

cout<<"请选择所需功能的前置编号:

";

cin>>s;

if(s>4)

{

cout<<"数据输入有误!

请重新输入:

"<

}

else

{

switch(s)

{case0:

exit(0);break;

case1:

FCFS(a,n);break;

case2:

SSTF(a,n);break;

case3:

SCAN(a,n);break;

case4:

CSCAN(a,n);break;

}

}

}

return0;

}

//先来先服务调度算法(FCFS)

voidFCFS(inta[],intn)

{

intj,i,first=0,now;

floatsum=0,m;

cout<<"请输入当前磁道号:

";

cin>>now;//确定当前磁头所在位置

cout<<"磁盘调度顺序为:

"<

for(i=0;i

{

cout<

}

//计算sum

for(i=0,j=1;j

{

first+=abs(a[j]-a[i]);//外围磁道与最里面磁道的距离

}

sum+=first+abs(now-a[0]);

cout<

cout<<"移动的总磁道数为:

"<

m=sum/n;

cout<<"平均寻道长度为:

"<

}

//最短寻道时间算法(SSTF)

voidSSTF(inta[],intn)

{

inttemp;

intk=1;

intnow,l,r;

inti,j;

floatm,sum=0;

//将磁道号按递增排序

for(i=0;i

for(j=i+1;j

{

if(a[i]>a[j])

{

temp=a[i];

a[i]=a[j];

a[j]=temp;

}

}

cout<<"按递增顺序排好的磁道显示为:

"<

for(i=0;i

{

cout<

}

cout<

cout<<"请输入当前的磁道号:

";

cin>>now;//确定当前磁头所在位置

cout<<"磁盘调度顺序为:

"<

if(a[n-1]<=now)//当前磁头位置大于最外围欲访问磁道

{

for(i=n-1;i>=0;i--)

cout<

sum=now-a[0];

}

else

if(a[0]>=now)//当前磁头位置小于最里欲访问磁道

{

for(i=0;i

cout<

sum=a[n-1]-now;

}

else

{

while(a[k]

{

k++;

}

l=k-1;//在磁头位置的前一个欲访问磁道

r=k;//磁头欲访问磁道

while((l>=0)&&(r

{

if((now-a[l])<=(a[r]-now))//选择离磁头近的磁道

{

cout<

sum+=now-a[l];

now=a[l];

l=l-1;

}

else

{

cout<

sum+=a[r]-now;

now=a[r];

r=r+1;

}

}

if(l=-1)//磁头位置里侧的磁道已访问完

{

for(j=r;j

{

cout<

}

sum+=a[n-1]-a[0];

}

if(r==n)//磁头位置外侧的磁道已访问完

{

for(j=k-1;j>-1;j--)//访问磁头位置里侧的磁道

{

cout<

}

sum+=a[n-1]-a[0];

}

}

cout<

cout<<"移动的总道数为:

"<

m=sum/n;

cout<<"平均寻道长度为:

"<

}

//扫描算法(SCAN)

voidSCAN(inta[],intn)

{

inttemp;

intk=1;

intnow,l,r;

inti,j;

floatm,sum=0;

for(i=0;i

for(j=i+1;j

{

if(a[i]>a[j])

{

temp=a[i];

a[i]=a[j];

a[j]=temp;

}

}

cout<<"按递增顺序排好的磁道为:

"<

for(i=0;i

{

cout<

}

cout<

cout<<"请输入当前的磁道号:

";

cin>>now;

//以下算法确定磁道访问顺序

if(a[n-1]<=now)//磁头位置大于最外围欲访问磁道

{

for(i=n-1;i>=0;i--)

cout<

sum=now-a[0];

}

else

if(a[0]>=now)//磁头位置小于最里欲访问磁道

{

for(i=0;i

cout<

sum=a[n-1]-now;

}

else//磁头位置在最里侧磁道与最外侧磁道之间

{intd;

while(a[k]

{//确定当前磁道在已排的序列中的位置

k++;

}

l=k-1;//在磁头位置的前一个欲访问磁道

r=k;//磁头欲访问磁道

cout<<"请输入当前磁头移动的方向(0表示向内,1表示向外):

";

cin>>d;//确定磁头访问的方向

cout<<"磁盘调度顺序为:

";

if(d==0||d==1)

{

if(d==0)//磁头向内

{

for(j=l;j>=0;j--)

{

cout<

}

for(j=r;j

{

cout<

}

sum=now-2*a[0]+a[n-1];

}

if(d==1)//磁头向外

{

for(j=r;j

{

cout<

}

for(j=l;j>=0;j--)

{

cout<

}

sum=2*a[n-1]-now-a[0];

}

}

else

cout<<"请输入0或1!

"<

}

cout<

cout<<"移动的总道数为:

"<

m=sum/n;

cout<<"平均寻道长度为:

"<

}

//循环扫描算法(CSCAN)

voidCSCAN(inta[],intn)

{

inttemp;

intnow,l,r;

inti,j;

floatm,sum=0;

intk=1;

for(i=0;i

for(j=i+1;j

{

if(a[i]>a[j])

{

temp=a[i];

a[i]=a[j];

a[j]=temp;

}

}

cout<<"按递增顺序排好的磁道为:

"<

for(i=0;i

{

cout<

}

cout<

cout<<"请输入当前的磁道号:

";

cin>>now;//确定当前磁道号

if(a[n-1]<=now)//磁头位置大于最外围欲访问磁道

{

for(i=0;i

cout<

sum=now-2*a[0]+a[n-1];

}

else

if(a[0]>=now)//磁头位置小于最里欲访问磁道

{

for(i=0;i

cout<

sum=a[n-1]-now;

}

else//磁头位置在最里侧磁道与最外侧磁道之间

{intd;

while(a[k]

{

k++;

}

l=k-1;//在磁头位置的前一个欲访问磁道

r=k;//磁头欲访问磁道

cout<<"请输入当前磁头移动的方向(0表示向内,1表示向外):

";

cin>>d;//确定磁头访问的方向

cout<<"磁盘调度顺序为:

";

if(d==0||d==1)

{

if(d==1)//磁头向外侧访问

{

for(j=r;j

{

cout<

}

for(j=0;j

{

cout<

}

sum=2*a[n-1]-now-2*a[0]+a[l];

}

if(d==0)//磁头向内侧访问

{

for(j=r-1;j>=0;j--)

{

cout<

}

for(j=n-1;j>=r;j--)

{

cout<

}

sum=2*a[n-1]-2*a[0]+now-a[r];

}

}

else

cout<<"请输入0或1!

";

}

cout<

cout<<"移动的总道数为:

"<

m=sum/n;

cout<<"平均寻道长度为:

"<

}

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

当前位置:首页 > 高等教育 > 理学

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

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