模拟实现磁盘调度算法.docx
《模拟实现磁盘调度算法.docx》由会员分享,可在线阅读,更多相关《模拟实现磁盘调度算法.docx(15页珍藏版)》请在冰点文库上搜索。
模拟实现磁盘调度算法
《操作系统》课程实验
实验课题:
模拟实现磁盘调度算法
姓名:
****
学号:
*****
年级班级:
08级信息与计算科学
教学班级:
操作系统
专业方向:
08信本软件方向
指导教师:
实验时间:
2010-12-9
一、实验名称:
模拟实现磁盘调度算法
1实验目的:
a、观察、体会操作系统的磁盘调度方法,并通过一个简单的磁盘调度模拟程序的实现,加深对磁盘调度的理解。
b、提高实际动手编程能力,为日后从事软件开发工作打下坚实基础。
2实验要求:
a、使用模块化设计思想来设计。
b、给出主函数和各个算法函数的流程图。
c、学生可按照自身条件,随意选择采用的算法。
二、实验算法分析总流程图
三、实验内容及实验步骤
1实验内容
a、模拟实现磁盘调度算法:
FCFS,最短寻道优先,电梯算法(实现其中之一种以上)。
b、磁道请求服务顺序由用户输入(可通过从指定的文本文件(TXT文件)中取出)。
2实验步骤
1)打开microsoftvasualC++6.0
“开始”菜单—所有程序—单击“microsoftvasualC++6.0”,进入创建页面。
2)单击标题栏“文件”选择“新建”进入界面如下:
选择‘工程,win32consoleapplication’编辑工程名称‘zhuxuemin4’存储在d盘,创建‘创建新工作区’确定。
3)创建文件:
单击标题栏“文件”选择“新建”进入界面类似于上面的界面。
4)在建好的文件中加入附件中的源程序,并进行编译。
四、实验原始记录及结果分析
1先来先服务调度算法
2最短寻道优先调度算法
3电梯调度算法
五、参考代码
#include
#include
#include
#include
constintMAXQUEUE=200;//定义请求队列最大长度//磁道号请求结构体定义
typedefstructTRACK_Node
{intiGo;//要访问的磁道号
intiVisited;//磁道是否已经访问标志(1:
已访问;0:
末访问)}TRACK;
TRACKqueue[MAXQUEUE];//磁道号请求队列数组
intiReqNum=0;//磁道访问请求数
intiStart=0;//磁头初始位置
intiNow=0;//磁头当前位置
intiSum=0;//总移动磁道数
intiInput;//用户当前输入的整数
charsFileName[20];//文件名
voidInit()//初始化函数
{inti;
for(i=0;i{queue[i].iGo=-1;//设置要访问的磁道号为不可能的数-1,以区别正常请求磁道号queue[i].iVisited=0;//设置磁道是否已经访问标志为0:
末访问}}//voidInit()
voidReset()//重置访问标志、磁头当前位置、总移动磁道数
{inti;
for(i=0;i{queue[i].iVisited=0;//设置磁道是否已经访问标志为0:
末访问
}printf("\n请输入磁头的初始磁道号(整数):
");
scanf("%d",&iStart);//从标准输入获取用户当前输入的磁头初始位置
iNow=iStart;//磁头当前位置
iSum=0;//总移动磁道数}//voidReset()
intReadTrackFile()//读入磁道号流文件
{FILE*fp;
intiTemp;
cout<<"\n请输入磁道号流(文本)文件名(注意:
包括后缀名):
";
cin>>sFileName;//从标准输入获取用户当前输入的文件名
if((fp=fopen(sFileName,"r"))==NULL)
{cout<磁道号流文件"<!
"<{while(!
feof(fp))//将文件中输入的磁道号依次存入磁道号请求队列数组
{fscanf(fp,"%d",&iTemp);
queue[iReqNum].iGo=iTemp;
iReqNum++;//磁道访问请求数}}//if((fp=fopen(sFileName,"r"))==NULL)
return0;}//voidReadTrackFile()
voidFCFS()//先来先服务调度算法
{inti;
Reset();//重置访问标志、磁头当前位置、总移动磁道数
cout<cout<<"先来先服务调度算法的调度结果:
"<cout<<"初始磁道号:
"<cout<<"序号下一磁道号移动的磁道数"<for(i=0;i{cout<<""<
iSum+=abs(queue[i].iGo-iNow);//累加总移动磁道数
iNow=queue[i].iGo;//设置磁头当前位置为当前访问磁道号}
cout<"<cout<"<printf("\n平均移动磁道数:
%.2f\n\n",(float)iSum/(float)iReqNum);}//voidFCFS()
voidSSTF()//最短寻道优先调度算法
{inti,j;
intiNext;//下一磁道号
Reset();//重置访问标志、磁头当前位置、总移动磁道数cout<cout<cout<<"最短寻道优先调度算法的调度结果:
"<cout<<"初始磁道号:
"<cout<<"序号下一磁道号移动的磁道数"<for(i=0;i{iNext=0;
while(queue[iNext].iVisited!
=0)//跳过已访问的磁道号
{iNext++;}//while
for(j=iNext;j{//寻找下一个寻道距离最短的末访问磁道号
if((queue[j].iVisited==0)&&(abs(iNow-queue[iNext].iGo)>abs(iNow-queue[j].iGo)))
{iNext=j;}}//for(j=iNext;jcout<<""<
iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数
queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1:
已访问
iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号}//for(i=0;icout<"<cout<"<printf("\n平均移动磁道数:
%.2f\n\n",(float)iSum/(float)iReqNum);
}//voidSSTF()
voidSCAN()//电梯调度算法
{inti,j;
intiNext;//下一磁道号
intiMinMove;//当前方向上最短寻道距离
cout<cout<"<cout<<"1磁头初始向内"<cin>>iInput;//从标准输入获取用户当前输入的整数
switch(iInput)//用户当前输入的整数
{case1:
//磁头初始向内
Reset();//重置访问标志、磁头当前位置、总移动磁道数
cout<cout<<"电梯调度算法--磁头初始向内的调度结果:
"<cout<<"初始磁道号:
"<cout<<"序号下一磁道号移动的磁道数"<for(i=0;i{iMinMove=9999;
iNext=-1;
for(j=0;j{if((queue[j].iVisited==0)&&(queue[j].iGo>=iNow))
{if(abs(queue[j].iGo-iNow){iNext=j;
iMinMove=abs(queue[j].iGo-iNow);
}//if(abs(queue[j].iGo-iNow)}//if((queue[j].iVisited==0)&&(queue[j].iGo>=iNow))
}//for(j=0;jif(iNext!
=-1)
{cout<<""<
iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数
iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号
queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1:
已访问}//if(iNext!
=-1)
else//掉头向外
{for(j=0;j{if((queue[j].iVisited==0)&&(queue[j].iGo{if(abs(queue[j].iGo-iNow){iNext=j;
iMinMove=abs(queue[j].iGo-iNow);
}}}//for(j=0;jcout<<""<
iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数
iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号
queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1:
已访问}//if(iNext!
=-1)}//for(i=0;icout<"<cout<"<printf("\n平均移动磁道数:
%.2f\n\n",(float)iSum/(float)iReqNum);
break;
case2:
//磁头初始向外
Reset();//重置访问标志、磁头当前位置、总移动磁道数
cout<cout<"<cout<<"初始磁道号:
"<cout<<"序号下一磁道号移动的磁道数"<for(i=0;i{iMinMove=9999;
iNext=-1;
for(j=0;j{if((queue[j].iVisited==0)&&(queue[j].iGo<=iNow))
{if(abs(queue[j].iGo-iNow){iNext=j;
iMinMove=abs(queue[j].iGo-iNow);
}//if(abs(queue[j].iGo-iNow)}//if((queue[j].iVisited==0)&&(queue[j].iGo<=iNow))
}//for(j=0;jif(iNext!
=-1)
{cout<<""<
iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数
iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号
queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1:
已访问}else//掉头向内
{for(j=0;j{if((queue[j].iVisited==0)&&(queue[j].iGo>iNow))
{if(abs(queue[j].iGo-iNow){iNext=j;
iMinMove=abs(queue[j].iGo-iNow);}//if(abs(queue[j].iGo-iNow)}//if((queue[j].iVisited==0)&&(queue[j].iGo>iNow))}//for(j=0;jcout<<""<
iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数
iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号
queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1:
已访问}//if(iNext!
=-1)}//for(i=0;icout<"<cout<"<printf("\n平均移动磁道数:
%.2f\n\n",(float)iSum/(float)iReqNum);
break;
default:
printf("\n输入错误!
!
\n\n");
return;
}//switch(iInput)}//voidSCAN()
voidVersion()//显示版权信息函数
{cout<cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━┓"<cout<<"┃ 磁盘调度算法模拟系统 ┃"<cout<<"┠───────────────────────┨"<cout<<"┃ (c)AllRightReserved ┃"<cout<<"┃ 程坤 ┃"<cout<<"┃ Version2010build2.0 ┃"<cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━┛"<cout<voidmain()
{inti;
boolbGoOn;//是否继续磁盘调度算法模拟的标志
charsGoOn[1];//用户输入是否继续磁盘调度算法模拟的字母:
y、Y、N、nVersion();//显示版权信息函数
Init();//初始化函数
if(ReadTrackFile()==-1)//读入磁道号流文件
{printf("读入磁道号流文件失败!
!
\n\n");}
else
{bGoOn=true;
while(bGoOn)
{cout<cout<<"从磁道号流文件"<"<for(i=0;i{cout<cout<"<iInput=-1;//用户输入的整数以选择算法
cout<"<cin>>iInput;//从标准输入获取用户当前输入的整数
switch(iInput)//用户输入的整数以选择算法
{case1:
FCFS();//先来先服务调度算法
break;
case2:
SSTF();//最短寻道优先调度算法
break;
case3:
SCAN();//电梯调度算法
break;
default:
printf("\n输入的算法编号错误!
!
\n\n");
return;}//switch(iInput)
bGoOn=false;
strcpy(sGoOn,"");
cout<<"要继续进行磁盘调度算法模拟吗?
(Y/N)"<cin>>sGoOn;
bGoOn=(sGoOn[0]=='y'||sGoOn[0]=='Y');
}//whilebGoOn}//if(ReadTrackFile()==-1)}