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

上传人:b****8 文档编号:28837171 上传时间:2023-07-20 格式:DOCX 页数:19 大小:97.96KB
下载 相关 举报
操作系统实验四磁盘调度算法.docx_第1页
第1页 / 共19页
操作系统实验四磁盘调度算法.docx_第2页
第2页 / 共19页
操作系统实验四磁盘调度算法.docx_第3页
第3页 / 共19页
操作系统实验四磁盘调度算法.docx_第4页
第4页 / 共19页
操作系统实验四磁盘调度算法.docx_第5页
第5页 / 共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-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1