操作系统磁盘调度算法97120Word格式文档下载.docx
《操作系统磁盘调度算法97120Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统磁盘调度算法97120Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
voidFCFS(inta[],intn);
voidSSTF(inta[],intn);
voidSCAN(inta[],intn);
intmain()
{
intn;
//磁道的个数
//ints;
//选择键
intw;
//磁道号生成方式
int*a=newint[n];
//磁道号
//说明
cout<
<
"
请输入磁道的个数:
;
cin>
>
n;
endl;
请选择磁道号的生成方式(1—随机生成,2—手动输入):
w;
do{
if(w!
=1&
&
w!
=2)
{
cout<
请选择1或2:
cin>
}
if(w==1)
{
/////////////////////////////////////////随机数产生
srand((unsigned)time(NULL));
for(inti=0;
i<
i++)
{
a[i]=rand()%100;
}
/////////////////////////////////////////随机数产生end
}
elseif(w==2)
////////////////////////////////////手动输入磁道号
{
cin>
a[i];
////////////////////////////////////手动输入磁道号end
}
}while(w!
=2);
ints;
while
(1)
{
/////////////////////////////////////////磁道号显示
生成的磁道号:
for(inti=0;
{
cout<
a[i]<
"
}
/////////////////////////////////////////磁道号显示end
|*************************************|"
|请选择何种算法:
|"
|1、先来先服务算法(FCFS)|"
|2、最短寻道时间算法(SSTF)|"
|3、扫描算法(SCAN)|"
|4、清除界面|"
|0、退出|"
请选择要用的功能:
s;
if(s!
s!
=2&
=3&
=0&
=4)
输入有误!
}
else
{
switch(s)
{
case0:
cout<
|感谢使用|"
|如遇bug或有疑问联系|"
|企鹅号:
595296310|"
|by-无风嘟嘟|"
exit(0);
break;
}
case1:
FCFS(a,n);
break;
case2:
SSTF(a,n);
break;
case3:
SCAN(a,n);
case4:
system("
cls"
);
default:
cout<
请再次选择"
}
return0;
}
///////////////////////////////////////////////////////////////////先来先服务FCFS
voidFCFS(inta[],intn)
intsum=0,i,j,num1=0,now;
floataverag;
先来先服务算法(FCFS):
请输入当前磁道号:
now;
磁盘调度顺序为:
for(i=0;
i++)//按访问顺序输出磁道号
//////////////////////////////////计算sum
for(i=0,j=1;
j<
i++,j++)
num1+=abs(a[j]-a[i]);
//外围磁道与最里面磁道的距离
sum+=num1+abs(now-a[0]);
移动的总磁道数:
sum<
averag=float(sum)/n;
平均寻道长度:
averag<
//////////////////////////////////////////最短寻道时间算法SSTF
voidSSTF(inta[],intn)
inttemp;
intk=1;
intnow,l,r;
inti,j,sum=0;
最短寻道时间算法(SSTF):
////////////////////////将磁道号按递增排序
for(j=i+1;
j++)
if(a[i]>
a[j])
temp=a[i];
a[i]=a[j];
a[j]=temp;
////////////////////将磁道号按递增排序end
///////////////输出排好的磁道顺序
按递增顺序排好的磁道:
for(i=0;
///////////////输出排好的磁道顺序end
请输入当前的磁道号:
//确定当前磁头所在位置
////////////////////////////////////////////////////////以下算法确定磁道访问顺序
if(a[n-1]<
=now)//当前磁头位置大于最外围欲访问磁道
for(i=n-1;
i>
=0;
i--)
}
sum=now-a[0];
elseif(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;
else//选择离磁头近的磁道(磁头靠右近)
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--)//访问磁头位置里侧的磁道
sum+=a[n-1]-a[0];
移动的总道数:
/////////////////////////////////////////////////////////////////////////扫描算法SCAN
voidSCAN(inta[],intn)
intx;
扫描算法(SCAN):
///////////////////按磁道递增排序
for(j=i+1;
if(a[i]>
///////////////////按磁道递增排序end
///////////////////输出按磁道递增排序end
////////////////////////////////////////////////////以下算法确定磁道访问顺序
=now)//磁头位置大于最外围欲访问磁道
for(i=n-1;
=now)//磁头位置小于最里欲访问磁道
sum=a[n-1]-now;
else//磁头位置在最里侧磁道与最外侧磁道之间
do{
intd;
while(a[k]<
now)
{//确定当前磁道在已排的序列中的位置
k++;
l=k-1;
//在磁头位置的前一个欲访问磁道
r=k;
//磁头欲访问磁道
请选择当前磁头移动的方向(0—向内,1—向外):
d;
//确定磁头访问的方向
if(d==0||d==1)
if(d==0)//磁头向左
for(j=l;
j--)
{
cout<
}
for(j=r;
sum=now-2*a[0]+a[n-1];
if(d==1)//磁头向右
{
for(j=r;
{
cout<
}
for(j=l;
sum=2*a[n-1]-now-a[0];
}
移动的总道数:
averag=float(sum)/n;
请选择是否继续测试(任意键—继续0—跳出)"
cin>
x;
请选择0或1:
}while(x!
=0);
实验心得:
通过这次实验,我对磁盘管理的算法有进一步的理解而且并不是很难。
但是不知道具体如何调用到系统里面。