模拟实现磁盘调度算法.docx

上传人:b****7 文档编号:16165125 上传时间:2023-07-11 格式:DOCX 页数:15 大小:172.18KB
下载 相关 举报
模拟实现磁盘调度算法.docx_第1页
第1页 / 共15页
模拟实现磁盘调度算法.docx_第2页
第2页 / 共15页
模拟实现磁盘调度算法.docx_第3页
第3页 / 共15页
模拟实现磁盘调度算法.docx_第4页
第4页 / 共15页
模拟实现磁盘调度算法.docx_第5页
第5页 / 共15页
模拟实现磁盘调度算法.docx_第6页
第6页 / 共15页
模拟实现磁盘调度算法.docx_第7页
第7页 / 共15页
模拟实现磁盘调度算法.docx_第8页
第8页 / 共15页
模拟实现磁盘调度算法.docx_第9页
第9页 / 共15页
模拟实现磁盘调度算法.docx_第10页
第10页 / 共15页
模拟实现磁盘调度算法.docx_第11页
第11页 / 共15页
模拟实现磁盘调度算法.docx_第12页
第12页 / 共15页
模拟实现磁盘调度算法.docx_第13页
第13页 / 共15页
模拟实现磁盘调度算法.docx_第14页
第14页 / 共15页
模拟实现磁盘调度算法.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

模拟实现磁盘调度算法.docx

《模拟实现磁盘调度算法.docx》由会员分享,可在线阅读,更多相关《模拟实现磁盘调度算法.docx(15页珍藏版)》请在冰点文库上搜索。

模拟实现磁盘调度算法.docx

模拟实现磁盘调度算法

《操作系统》课程实验

实验课题:

模拟实现磁盘调度算法

姓名:

****

学号:

*****

年级班级:

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;j

cout<<""<

iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数

queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1:

已访问

iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号}//for(i=0;i

cout<

"<

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;j

if(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;j

cout<<""<

iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数

iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号

queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1:

已访问}//if(iNext!

=-1)}//for(i=0;i

cout<

"<

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;j

if(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;j

cout<<""<

iSum+=abs(queue[iNext].iGo-iNow);//累加总移动磁道数

iNow=queue[iNext].iGo;//设置磁头当前位置为当前访问磁道号

queue[iNext].iVisited=1;//设置磁道是否已经访问标志为1:

已访问}//if(iNext!

=-1)}//for(i=0;i

cout<

"<

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)}

【下载本文档,可以自由复制内容或自由编辑修改内容,更多精彩文章,期待你的好评和关注,我将一如既往为您服务】

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2