磁盘调度.docx

上传人:b****5 文档编号:11627547 上传时间:2023-03-29 格式:DOCX 页数:18 大小:111.06KB
下载 相关 举报
磁盘调度.docx_第1页
第1页 / 共18页
磁盘调度.docx_第2页
第2页 / 共18页
磁盘调度.docx_第3页
第3页 / 共18页
磁盘调度.docx_第4页
第4页 / 共18页
磁盘调度.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

磁盘调度.docx

《磁盘调度.docx》由会员分享,可在线阅读,更多相关《磁盘调度.docx(18页珍藏版)》请在冰豆网上搜索。

磁盘调度.docx

磁盘调度

实验报告

课程名称

操作系统

题目

实验4:

磁盘调度

姓名

实验地点

实验楼B软件实习基地

学号

1.实验目的

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

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

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

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

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

2.实验要求

1.要求以个人为单位完成全部实验题目,并在下课前五分钟将本次实验课完成的内容打包发送至指定邮箱;

2.前十名完成实验的同学在教师检查后可以获得一次实验加分;

3.实验课进行过程中不得进行浏览网页、玩游戏等与课程无关内容,违法规定的应给予课程判定不及格的处分;

4.实验课进行过程中应严格遵守实验室相关规定,按照老师的要求完成相关设计任务。

3.实验内容

1、模拟电梯调度算法,对磁盘进行移臂操作

2、假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。

为了模拟以上两个进程的执行,可以考虑使用随机数来确定二者的允许顺序,程序结构图参考附图:

3、“接受请求”进程建立一张“进程请求I/O”表,指出等待访问磁盘的进程要求访问的磁道,表的格式如下:

进程名

要求访问的磁道号

4、“磁盘调度”的功能是查“请求I/O”表,当有等待访问的进程时,按电梯调度算法(SCAN算法)从中选择一个等待访问的进程,按其指定的要求访问磁道。

SCAN算法参考课本第九章。

算法模拟框图略。

5、附图中的“初始化”工作包括:

初始化“请求I/O”表,设置置当前移臂方向;当前磁道号。

并且假设程序运行前“请求I/O”表中已有若干进程(4~8个)申请访问相应磁道。

4.数据结构与算法设计

1.数据结构

主要用到的函数如下:

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

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

int*bubble(intcidao[],intm)//按从小到大排序

voidFCFS(intcidao[],intm)//先来先服务调度算法

voidSSTF(intcidao[],intm)//最短寻道时间优先调度算法

voidSCAN(intcidao[],intm)//扫描调度算法

voidCSCAN(intcidao[],intm)//循环扫描调度算法

2.算法设计

⑴算法设计思想

设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。

常用的分配策略有先请求先分配、优先级高者先分配等策略。

在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。

操作系统中,对磁盘的访问要求来自多方面,常常需要排队。

这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。

访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。

因此磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。

⑵算法设计流程图

FCFS算法流程图:

SSTF算法流程图:

 

SCAN算法流程图:

CSCAN算法流程图:

5.实验总结与问题分析

通过此次实验,我对操作系统的基础知识了解得更深了,同时对磁盘调度的四种算法——先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)、循环扫描算法(CSCAN)有了更深刻的理解和掌握,使我能够为磁盘调度选择适当的算法,提高CPU工作效率。

实验过程中遇到的问题在老师和同学的帮助下顺利解决,我深刻认识到算法的逻辑性对程序的重要影响,算法的准确度对程序运行结果的重要影响,这对我以后在操作系统的学习中有极大帮助。

 

实验

成绩

 

指导

教师

源程序:

#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<<"*****************************磁盘调度算法与实现************************"<

cout<<"\n请输入磁道序列(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<<"******"<

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

cout<<"****"<

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

cout<<"****"<

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

cout<<"****"<

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

cout<<"****"<

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

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

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

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;

}

}

}

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

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

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

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