磁盘调度Word格式文档下载.docx
《磁盘调度Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《磁盘调度Word格式文档下载.docx(13页珍藏版)》请在冰点文库上搜索。
"
DISKMAX);
scanf("
%d"
base_num);
if(*base_num<
=0||*base_num>
DISKMAX)
{
printf("
ERROR!
);
exit(0);
}
\n"
\n基本磁道数如下:
for(i=0;
i<
*base_num;
i++)
%d"
i);
}
//设置请求访问磁道数
voidSetRequestDisk(int*R,int*request_num,intbase_num)
inti;
srand(time(NULL));
\n输入请求的磁道数(1~%d)"
DISKTOTAL);
scanf("
request_num);
if(*request_num<
=0||*request_num>
DISKTOTAL)
{
}
\n系统随机产生的磁道请求位置:
for(i=0;
*request_num;
R[i]=rand()%(base_num-1);
//生成随机数
R[i]);
//设置当前磁道
voidSetPresentDisk(int*present_disk,int*base_num)
\n请输入磁头的开始位置(0~%d):
*base_num-1);
scanf("
present_disk);
if(*present_disk<
0||*present_disk>
=*base_num)
3.3先来先服务算法(FCFS)模块
3.3.1功能
根据磁盘信息,模拟实现先来先服务磁盘调度算法。
3.3.2算法
voidFCFS(int*R,intpresent_disk,intrequest_num)
intcount=0;
//磁头移动总次数
intstep;
//访问下一个磁道磁头移动次数
\n移动序号移动路径移动距离"
step=abs(present_disk-R[0]);
//绝对值,求距离最近
count+=step;
\n1%d---->
%d%d"
present_disk,R[0],step);
//输出访问轨迹
request_num-1;
{//遍历数组
step=abs(R[i]-R[i+1]);
count+=step;
\n%d%d---->
i+2,R[i],R[i+1],step);
\n总的磁头移动距离:
count);
//输出磁头总移动次数
\n磁头的平均移动距离:
count/request_num);
//平均移动次数
3.4最短寻道时间优先算法(SSTF)模块
3.4.1功能
3.4.2算法
voidSSTF(int*R,intpresent_disk,intrequest_num)
inti=0;
inttemp,key;
intcount=0,step=0;
intup=0,down=0;
intup_step=0,down_step=0;
key=SearchPresent(R,request_num,present_disk);
//查找当前磁道
while(key!
=0&
&
key!
=request_num)
{//磁道没有到头或尾
i++;
if((R[key]-R[key-1-down])<
(R[key+1+up]-R[key]))
{//左边的磁道比右边的磁道近
temp=key-1-down;
//记录下一个磁道
down_step++;
down=0;
up=down_step+up_step;
else
{//右边的磁道比左边的磁道近
temp=key+1+up;
up_step++;
up=0;
down=up_step+down_step;
step=abs(R[key]-R[temp]);
\n%d%d-->
i,R[key],R[temp],step);
key=temp;
if(key==0)
{//当前磁头在头
temp=key+1+up;
//记录下一个将要访问的磁道
step=abs(R[key]-R[temp]);
\n%d%d-->
%d%d"
i,R[key],R[temp],step);
i++;
step=R[key+1]-R[key];
count+=step;
i,R[key],R[key+1],step);
key++;
else
{//当前磁头在尾
temp=key-1-down;
%d%d"
=0)
step=R[key]-R[key-1];
i,R[key],R[key-1],step);
key--;
3.5扫描算法(SCAN)模块
根据磁盘信息,模拟实现扫描算法。
voidSCAN(int*R,intpresent_disk,intrequest_num)
key=SearchPresent(R,request_num,present_disk);
temp=key;
if(key==request_num)
{//当前磁头在磁道头
{//向内移动
i+1,R[key],R[key-1],step);
i++;
elseif(key==0)
{//当前磁头在磁道尾
i+1,R[key],R[key+1],step);
{//当前磁头不在头或尾
{//向内移动
i+1,R[key],R[key-1],step);
step=R[temp+1]-R[key];
i,R[key],R[temp+1],step);
key=temp+1;
step=R[key+1]-R[key];
i+1,R[key],R[key+1],step);
}
4、实验结果及分析
4.1实验结果
4.2结果分析
由用户输入磁盘磁道数,然后随机生成请求的磁道数,根据用户的选择,按照不同的方法进行磁道的调度,记录磁头的移动过程,并记录磁头移动的距离,由结果可以比较出不同方法的磁头移动距离不同,因此,可以通过比较选择最优的调度算法。
5、附录
#include<
stdio.h>
stdlib.h>
time.h>
math.h>
#defineDISKMAX1000
#defineDISKTOTAL30
#defineOK1
#defineERROR-1
intmain()
intR[DISKTOTAL];
intbase_num,request_num,present_disk;
intchoose;
intflag=0;
\n********欢迎使用磁盘调度算法**********"
\n\n1.先来先服务算法FCFS"
\n\n2.扫描算法SCAN"
\n\n3.最短寻道时间优先算法SSTF"
\n\n4.退出."
\n\n**************************************"
SetBaseDisk(&
base_num);
SetRequestDisk(R,&
request_num,base_num);
SetPresentDisk(&
present_disk,&
do
\n\n请输入您的选择(不可重复输入!
!
):
(1,2,3,4)"
&
choose);
//输入选择
switch(choose)
case1:
{
FCFS(R,present_disk,request_num);
}break;
case2:
if(flag==0)
flag=Sort(R,request_num,present_disk);
//排序
SCAN(R,present_disk,request_num);
case3:
if(flag==0)
//排序
SSTF(R,present_disk,request_num);
}//switch
回车键继续......"
getchar();
}while(choose>
=1&
choose<
4);
\n谢谢使用....\n"
return0;