操作系统实验四磁盘调度算法.docx

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

操作系统实验四磁盘调度算法.docx

《操作系统实验四磁盘调度算法.docx》由会员分享,可在线阅读,更多相关《操作系统实验四磁盘调度算法.docx(19页珍藏版)》请在冰点文库上搜索。

操作系统实验四磁盘调度算法.docx

操作系统实验四磁盘调度算法

实验四磁盘调度

一、实验目的:

本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。

通过实验让学生理解和掌握磁盘调度的职能。

二、实验内容:

对磁盘进行移臂操作,模拟磁盘调度算法并计算平均寻道时间

三、实验准备:

1.相关理论知识:

(1)假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。

(3)磁盘是高速、大容量、旋转型、可直接存取的存储设备。

它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。

系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。

由于磁盘访问时间主要受寻道时间T的影响,为此需要采用合适的寻道算法,以降低寻道时间。

(2)磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。

当有进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。

当有多个进程提出输入输出请求而处于等待状态时,可用磁盘调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。

2.测试数据:

磁盘读写请求队列:

20,44,40,4,80,12,76

当前磁头位置:

50

试问采用FCFS、SSTF、SCAN磁盘调度算法时寻道顺序及平均寻道时间分别为多少?

四、实验过程:

1.流程图

SCAN算法(扫描算法)流程图:

 

2.源代码

#include

#include

#include

#include

#definemaxsize1000

/*********************判断输入数据是否有效**************************/

intdecide(charstr[])//判断输入数据是否有效

{

inti=0;

while(str[i]!

='\0')

{

if(str[i]<'0'||str[i]>'9')

{

return0;

break;

}

i++;

}

returni;

}

/******************将字符串转换成数字***********************/

inttrans(charstr[],inta)//将字符串转换成数字

{

inti;

intsum=0;

for(i=0;i

{

sum=sum+(int)((str[i]-'0')*pow(10,a-i-1));

}

returnsum;

}

/*********************冒泡排序算法**************************/

int*bubble(intcidao[],intm)

{

inti,j;

inttemp;

for(i=0;i

for(j=i+1;j

{

if(cidao[i]>cidao[j])

{

temp=cidao[i];

cidao[i]=cidao[j];

cidao[j]=temp;

}

}

cout<<"排序后的磁盘序列为:

";

for(i=0;i

{

cout<

}

cout<

returncidao;

}

/*********************先来先服务调度算法************************/

voidFCFS(intcidao[],intm)//磁道号数组,个数为m

{

intnow;//当前磁道号

intsum=0;//总寻道长度

intj,i;

inta;

charstr[100];

floatave;//平均寻道长度

cout<<"磁盘请求序列为:

";

for(i=0;i

{

cout<

}

cout<

cout<<"请输入当前的磁道号:

";

B:

cin>>str;//对输入数据进行有效性判断

a=decide(str);

if(a==0)

{

cout<<"输入数据的类型错误,请重新输入!

"<

gotoB;

}

else

now=trans(str,a);//输入当前磁道号

sum+=abs(cidao[0]-now);

cout<<"磁盘扫描序列为:

";

for(i=0;i

{

cout<

}

for(i=0,j=1;j

{

sum+=abs(cidao[j]-cidao[i]);

ave=(float)(sum)/(float)(m);

}

cout<

cout<<"平均寻道长度:

"<

}

/**********************最短寻道时间优先调度算法********************/

voidSSTF(intcidao[],intm)

{

intk=1;

intnow,l,r;

inti,j,sum=0;

inta;

charstr[100];

floatave;

cidao=bubble(cidao,m);//调用冒泡排序算法排序

cout<<"请输入当前的磁道号:

";

C:

cin>>str;//对输入数据进行有效性判断

a=decide(str);

if(a==0)

{

cout<<"输入数据的类型错误,请重新输入!

"<

gotoC;

}

else

now=trans(str,a);//输入当前磁道号

if(cidao[m-1]<=now)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务

{

cout<<"磁盘扫描序列为:

";

for(i=m-1;i>=0;i--)

cout<

sum=now-cidao[0];

}

if(cidao[0]>=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务

{

cout<<"磁盘扫描序列为:

";

for(i=0;i

cout<

sum=cidao[m-1]-now;

}

if(now>cidao[0]&&now

{

cout<<"磁盘扫描序列为:

";

while(cidao[k]

{

k++;

}

l=k-1;

r=k;

while((l>=0)&&(r

{

if((now-cidao[l])<=(cidao[r]-now))//选择与当前磁道最近的请求给予服务

{

cout<

sum+=now-cidao[l];

now=cidao[l];

l=l-1;

}

else

{

cout<

sum+=cidao[r]-now;

now=cidao[r];

r=r+1;

}

}

if(l==-1)//磁头移动到序列的最小号,返回外侧扫描仍未扫描的磁道

{

for(j=r;j

{

cout<

}

sum+=cidao[m-1]-cidao[0];

}

else//磁头移动到序列的最大号,返回内侧扫描仍未扫描的磁道

{

for(j=l;j>=0;j--)

{

cout<

}

sum+=cidao[m-1]-cidao[0];

}

}

ave=(float)(sum)/(float)(m);

cout<

cout<<"平均寻道长度:

"<

}

 

/*************************扫描调度算法*************************/

voidSCAN(intcidao[],intm)//先要给出当前磁道号和移动臂的移动方向

{

intk=1;

intnow,l,r,d;

inti,j,sum=0;

inta;

charstr[100];

floatave;

cidao=bubble(cidao,m);//调用冒泡排序算法排序

cout<<"请输入当前的磁道号:

";

D:

cin>>str;//对输入数据进行有效性判断

a=decide(str);

if(a==0)

{

cout<<"输入数据的类型错误,请重新输入!

"<

gotoD;

}

else

now=trans(str,a);//输入当前磁道号

if(cidao[m-1]<=now)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务,此情况同最短寻道优先

{

cout<<"磁盘扫描序列为:

";

for(i=m-1;i>=0;i--)

cout<

sum=now-cidao[0];

}

if(cidao[0]>=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先

{

cout<<"磁盘扫描序列为:

";

for(i=0;i

cout<

sum=cidao[m-1]-now;

}

if(now>cidao[0]&&now

{

while(cidao[k]

{

k++;

}

l=k-1;

r=k;

cout<<"请输入当前移动臂的移动的方向(1表示向外,0表示向内):

";

cin>>d;

if(d==0)//选择移动臂方向向内,则先向内扫描

{

cout<<"磁盘扫描序列为:

";

for(j=l;j>=0;j--)

{

cout<

}

for(j=r;j

{

cout<

}

sum=now-2*cidao[0]+cidao[m-1];

}

else//选择移动臂方向向外,则先向外扫描

{

cout<<"磁盘扫描序列为:

";

for(j=r;j

{

cout<

}

for(j=l;j>=0;j--)//磁头移动到最大号,则改变方向向内扫描未扫描的磁道

{

cout<

}

sum=-now-cidao[0]+2*cidao[m-1];

}

}

ave=(float)(sum)/(float)(m);

cout<

cout<<"平均寻道长度:

"<

}

/************************循环扫描调度算法*****************************/

voidCSCAN(intcidao[],intm)

{

intk=1;

intnow,l,r;

inti,j,sum=0;

inta;

charstr[100];

floatave;

cidao=bubble(cidao,m);//调用冒泡排序算法排序

cout<<"请输入当前的磁道号:

";

E:

cin>>str;//对输入数据进行有效性判断

a=decide(str);

if(a==0)

{

cout<<"输入数据的类型错误,请重新输入!

"<

gotoE;

}

else

now=trans(str,a);//输入当前磁道号

if(cidao[m-1]<=now)//若当前磁道号大于请求序列中最大者,则直接将移动臂移动到最小号磁道依次向外给予各请求服务

{

cout<<"磁盘扫描序列为:

";

for(i=0;i

cout<

sum=now-2*cidao[0]+cidao[m-1];

}

if(cidao[0]>=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先

{

cout<<"磁盘扫描序列为:

";

for(i=0;i

cout<

sum=cidao[m-1]-now;

}

if(now>cidao[0]&&now

{

cout<<"磁盘扫描序列为:

";

while(cidao[k]

{

k++;

}

l=k-1;

r=k;

for(j=r;j

{

cout<

}

for(j=0;j

{

cout<

}

sum=2*cidao[m-1]+cidao[l]-now-2*cidao[0];

}

ave=(float)(sum)/(float)(m);

cout<

cout<<"平均寻道长度:

"<

}

voidmain()

{

inta;

intc;//菜单项

intcidao[maxsize];

inti=0,count;

charstr[100];

cout<<"请输入磁道序列(0结束):

"<

A:

cin>>str;//对输入数据进行有效性判断

a=decide(str);

if(a==0)

{

cout<<"输入数据的类型错误,请重新输入!

"<

gotoA;//输入错误,跳转到A,重新输入

}

else

cidao[i]=trans(str,a);

i++;

while(cidao[i-1]!

=0)

{

cin>>str;//对输入数据进行有效性判断

a=decide(str);

if(a==0)

cout<<"输入数据的类型错误,请重新输入!

"<

else

{

cidao[i]=trans(str,a);

i++;

}

}

count=i-1;//要访问的磁道数

cout<<"你输入的磁道序列为:

";

for(i=0;i

{

cout<

}

cout<

while

(1)

{

cout<

cout<<"**********************************************"<

cout<<"系统菜单"<

cout<<"******"<

cout<<"**1.先来先服务**"<

cout<<"****"<

cout<<"**2.最短寻道时间优先**"<

cout<<"****"<

cout<<"**3.扫描调度**"<

cout<<"****"<

cout<<"**4.循环扫描**"<

cout<<"****"<

cout<<"**5.退出**"<

cout<<"******"<

G:

cout<<"请选择算法:

";

F:

cin>>str;//对输入数据进行有效性判断

a=decide(str);

if(a==0)

{

cout<<"输入数据的类型错误,请重新输入!

"<

gotoF;//输入错误,跳转到F,重新输入

}

else

c=trans(str,a);

if(c==5)

break;

if(c>5)

{

cout<<"数据输入错误!

请重新输入"<

gotoG;

}

switch(c)

{

case1:

//使用FCFS算法

FCFS(cidao,count);

break;

case2:

//使用SSTF算法

SSTF(cidao,count);

break;

case3:

//使用SCAN算法

SCAN(cidao,count);

break;

case4:

//使用CSCAN算法

CSCAN(cidao,count);

break;

}}}

3.运行界面:

五、实验心得:

通过本次实验,学习了解磁盘调度的工作原理及四种调度方法的工作原理,并且在当中发现了自己的不足,对以前所学过的知识理解得不够深刻,掌握得不够牢固,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。

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

当前位置:首页 > 工程科技 > 能源化工

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

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