磁盘调度算法代码 2Word文档格式.docx
《磁盘调度算法代码 2Word文档格式.docx》由会员分享,可在线阅读,更多相关《磁盘调度算法代码 2Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
三.目的
1.熟悉并掌握磁盘管理系统的设计方法,加深对所学各种磁盘调度算法及其算法的特点的了解。
2.掌握磁盘调度的基本概念,比较各种磁盘调度算法的优劣
四.要求
从课程设计的目的出发,通过设计工作的各个环节,达到以下设计要求:
1.对系统进行功能模块分析、控制模块分析正确;
2.系统设计要实用;
3.编程简练,可用,功能全面,具有较好的健壮性;
4.说明书、流程图要清楚。
五.详细设计及算法流程图
1.总流程图
2.先来先服务(FCFS)算法流程图
3.最短寻道时间优先(SSTF)算法流程图
4.扫描调度(SCAN)算法流程图
5.循环扫描(C-SCAN)算法流程图
附录:
修改后的程序:
#include<
iostream>
ctime>
usingnamespacestd;
voidFCFS(inta[],intn);
voidSSTF(inta[],intn);
voidSCAN(inta[],intn);
voidCSCAN(inta[],intn);
intmain()
{
intn;
//磁道的个数
ints;
//功能号
cout<
<
"
请输入当前磁道的个数:
endl;
cin>
>
n;
int*a=newint[n];
输入磁道号为:
;
for(inti=0;
i<
i++)
{
a[i];
a[i]<
"
}
while
(1)
{cout<
┏━━━━━━━━━━━━━━━━━━━━━━━┓"
┃ 磁盘调度算法功能列表 ┃"
┠───────────────────────┨"
┃1、先来先服务算法(FCFS)┃"
┃2、最短寻道时间算法(SSTF)┃"
┃3、扫描算法(SCAN)┃"
┃4、循环扫描算法(CSCAN)┃"
┃0、退出┃"
┗━━━━━━━━━━━━━━━━━━━━━━━┛"
请选择所需功能的前置编号:
s;
if(s>
4)
数据输入有误!
请重新输入:
}
else
switch(s)
{case0:
exit(0);
break;
case1:
FCFS(a,n);
break;
case2:
SSTF(a,n);
break;
case3:
SCAN(a,n);
case4:
CSCAN(a,n);
}
return0;
//先来先服务调度算法(FCFS)
voidFCFS(inta[],intn)
{
intj,i,first=0,now;
floatsum=0,m;
cout<
请输入当前磁道号:
cin>
now;
//确定当前磁头所在位置
磁盘调度顺序为:
for(i=0;
i++)//按访问顺序输出磁道号
//计算sum
for(i=0,j=1;
j<
i++,j++)
first+=abs(a[j]-a[i]);
//外围磁道与最里面磁道的距离
sum+=first+abs(now-a[0]);
移动的总磁道数为:
sum<
m=sum/n;
平均寻道长度为:
m<
//最短寻道时间算法(SSTF)
voidSSTF(inta[],intn)
inttemp;
intk=1;
intnow,l,r;
inti,j;
floatm,sum=0;
//将磁道号按递增排序
for(i=0;
for(j=i+1;
j++)
if(a[i]>
a[j])
temp=a[i];
a[i]=a[j];
a[j]=temp;
按递增顺序排好的磁道显示为:
//输出排好的磁道顺序
请输入当前的磁道号:
if(a[n-1]<
=now)//当前磁头位置大于最外围欲访问磁道
for(i=n-1;
i>
=0;
i--)
sum=now-a[0];
else
if(a[0]>
=now)//当前磁头位置小于最里欲访问磁道
for(i=0;
sum=a[n-1]-now;
while(a[k]<
now)//确定当前磁道在已排的序列中的位置
k++;
l=k-1;
//在磁头位置的前一个欲访问磁道
r=k;
//磁头欲访问磁道
while((l>
=0)&
&
(r<
n))
if((now-a[l])<
=(a[r]-now))//选择离磁头近的磁道
a[l]<
sum+=now-a[l];
now=a[l];
l=l-1;
a[r]<
sum+=a[r]-now;
now=a[r];
r=r+1;
if(l=-1)//磁头位置里侧的磁道已访问完
for(j=r;
j++)//访问磁头位置外侧的磁道
a[j]<
sum+=a[n-1]-a[0];
if(r==n)//磁头位置外侧的磁道已访问完
for(j=k-1;
j>
-1;
j--)//访问磁头位置里侧的磁道
移动的总道数为:
m=sum/n;
//扫描算法(SCAN)
voidSCAN(inta[],intn)
i++)//对访问磁道按由小到大顺序排列输出
for(j=i+1;
按递增顺序排好的磁道为:
//以下算法确定磁道访问顺序
if(a[n-1]<
=now)//磁头位置大于最外围欲访问磁道
=now)//磁头位置小于最里欲访问磁道
else//磁头位置在最里侧磁道与最外侧磁道之间
{intd;
now)
{//确定当前磁道在已排的序列中的位置
//磁头欲访问磁道
请输入当前磁头移动的方向(0表示向内,1表示向外):
d;
//确定磁头访问的方向
if(d==0||d==1)
{
if(d==0)//磁头向内
{
for(j=l;
j--)
{
}
sum=now-2*a[0]+a[n-1];
}
if(d==1)//磁头向外
{
for(j=r;
{
}
sum=2*a[n-1]-now-a[0];
}
cout<
请输入0或1!
移动的总道数为:
//循环扫描算法(CSCAN)
voidCSCAN(inta[],intn)
for(i=0;
//确定当前磁道号
=now)//磁头位置大于最外围欲访问磁道
=now)//磁头位置小于最里欲访问磁道
cout<
if(d==1)//磁头向外侧访问
{
j++)//先访问外侧磁道再转向最里欲访问磁道
for(j=0;
r;
sum=2*a[n-1]-now-2*a[0]+a[l];
}
if(d==0)//磁头向内侧访问
{
for(j=r-1;
for(j=n-1;
=r;
sum=2*a[n-1]-2*a[0]+now-a[r];
else
请输入0或1!