操作系统磁盘调度算法实验报告Word文档下载推荐.docx

上传人:b****7 文档编号:22027474 上传时间:2023-02-02 格式:DOCX 页数:23 大小:248.83KB
下载 相关 举报
操作系统磁盘调度算法实验报告Word文档下载推荐.docx_第1页
第1页 / 共23页
操作系统磁盘调度算法实验报告Word文档下载推荐.docx_第2页
第2页 / 共23页
操作系统磁盘调度算法实验报告Word文档下载推荐.docx_第3页
第3页 / 共23页
操作系统磁盘调度算法实验报告Word文档下载推荐.docx_第4页
第4页 / 共23页
操作系统磁盘调度算法实验报告Word文档下载推荐.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

操作系统磁盘调度算法实验报告Word文档下载推荐.docx

《操作系统磁盘调度算法实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统磁盘调度算法实验报告Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。

操作系统磁盘调度算法实验报告Word文档下载推荐.docx

3.模块流程图

3.1模块调用关系图

3.2模块程序流程图

FCFS算法(先来先服务)流程图:

SSTF(最短寻道时间优先算法)

算法流程图:

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

CSCAN算法(循环扫描算法)流程图:

4.测试数据和结果

输入磁道序列号:

25160786510062165345

选择算法1,平均寻道长度46.4444;

选择算法2,平均寻道长度为16.6667;

选择算法3,磁臂移动方向为由外向内,平均寻道长度为16.4444

选择算法3,磁臂移动方向为由内向外,平均寻道长度为31.5556;

选择算法4,平均寻道长度为31.4444

5.参考文献

《计算机操作系统(修订版)》汤子瀛西安电子科技大学出版社

《操作系统教程》方敏编西安电子科技大学出版社

《操作系统实用教程(第二版)》任爱华清华大学出版社

《操作系统原理与实践教程》 

周湘贞清华出版社

《程序设计基础教程》陈家骏机械工业出版社

6.总结

通过这次试验,我们清楚的了解到磁盘调度的详细过程和四种调度算法(先来先服务算法;

最短寻道时间优先算法;

扫描算法;

循环扫描算法)以及四种调度算法之间的差异和共性,同时,也看到了经过优化的算法会带来的好处!

在实验过程中,也遇到了不少问题,在实现扫描算法时出现了问题!

当输入的当前的磁道号不在磁盘请求序列中时,程序可以正常执行,当输入的当前的磁道号在磁盘请求序列中时,程序执行时出现处理序列顺序错误的问题,通过和同学的讨论,发现有两个循环中的自变量初值设置有问题,经过调整后,程序执行无误!

以后,在实现代码的过程中,一定会更加小心,防止出现低级错误导致程序出错!

附:

#include<

stdio.h>

stdlib.h>

iostream.h>

math.h>

#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<

a;

i++)

sum=sum+(int)((str[i]-'

)*pow(10,a-i-1));

returnsum;

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

int*bubble(intcidao[],intm)

{

inti,j;

inttemp;

m;

i++)//使用冒泡法按从小到大顺序排列

for(j=i+1;

j<

j++)

if(cidao[i]>

cidao[j])

{

temp=cidao[i];

cidao[i]=cidao[j];

cidao[j]=temp;

cout<

<

"

排序后的磁盘序列为:

;

for(i=0;

i++)//输出排序结果

cidao[i]<

"

endl;

returncidao;

}

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

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

intnow;

//当前磁道号

//总寻道长度

intj,i;

inta;

charstr[100];

floatave;

//平均寻道长度

磁盘请求序列为:

i++)//按先来先服务的策略输出磁盘请求序列

请输入当前的磁道号:

B:

cin>

>

str;

//对输入数据进行有效性判断

a=decide(str);

if(a==0)

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

gotoB;

else

now=trans(str,a);

//输入当前磁道号

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

磁盘扫描序列为:

i++)//输出磁盘扫描序列

for(i=0,j=1;

i++,j++)//求平均寻道长度

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

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

平均寻道长度:

ave<

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

voidSSTF(intcidao[],intm)

intk=1;

intnow,l,r;

inti,j,sum=0;

cidao=bubble(cidao,m);

//调用冒泡排序算法排序

C:

gotoC;

if(cidao[m-1]<

=now)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务

for(i=m-1;

i>

=0;

i--)

sum=now-cidao[0];

if(cidao[0]>

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

sum=cidao[m-1]-now;

if(now>

cidao[0]&

&

now<

cidao[m-1])//若当前磁道号大于请求序列中最小者且小于最大者

while(cidao[k]<

now)//确定当前磁道在已排的序列中的位置,后面的算法都用到了,可以直接复制后少量修改,节省时间。

k++;

l=k-1;

r=k;

while((l>

=0)&

(r<

m))//当前磁道在请求序列范围内

if((now-cidao[l])<

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

cidao[l]<

sum+=now-cidao[l];

now=cidao[l];

l=l-1;

else

cidao[r]<

sum+=cidao[r]-now;

now=cidao[r];

r=r+1;

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

for(j=r;

cidao[j]<

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

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

for(j=l;

j>

j--)

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

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

intnow,l,r,d;

D:

gotoD;

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

{

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

now)

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

d;

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

cout<

//输出向内扫描的序列

j++)//磁头移动到最小号,则改变方向向外扫描未扫描的磁道

//输出向外扫描的序列

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

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

j--)//磁头移动到最大号,则改变方向向内扫描未扫描的磁道

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

}

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

voidCSCAN(intcidao[],intm)

E:

gotoE;

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

now)//单向反复地从内向外扫描

//输出从当前磁道向外扫描的序列

for(j=0;

r;

j++)//当扫描完最大号磁道,磁头直接移动到最小号磁道,再向外扫描未扫描的磁道

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

voidmain()

intc;

//菜单项

intcidao[maxsize];

inti=0,count;

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

A:

cin>

gotoA;

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

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

i++;

while(cidao[i-1]!

=0)

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

count=i-1;

//要访问的磁道数

你输入的磁道序列为:

count;

i++)

//输出磁道序列

while

(1)

**********************************************"

******系统菜单******"

cout<

******"

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

****"

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

**3.扫描调度**"

**4.循环扫描**"

**5.退出**"

G:

请选择算法:

F:

gotoF;

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

c=trans(str,a);

if(c==5)

break;

if(c>

5)

数据输入错误!

请重新输入"

gotoG;

switch(c)

case1:

//使用FCFS算法

FCFS(cidao,count);

case2:

//使用SSTF算法

SSTF(cidao,count);

case3:

//使用SCAN算法

SCAN(cidao,count);

case4:

//使用CSCAN算法

CSCAN(cidao,count);

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

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

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