磁盘调度算法的模拟实现课程设计报告Word文档下载推荐.docx
《磁盘调度算法的模拟实现课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《磁盘调度算法的模拟实现课程设计报告Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
4.给出各磁盘调度算法的调度顺序和平均寻道长度
二、总体设计
1、算法实现
1.先来先服务算法(FCFS
先来先服务(FCFS调度:
按先来后到次序服务,未作优化。
最简单的移臂调度算法是“先来先服务”调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。
例如,如果现在读写磁头正在50号柱面上执行输出操作,而等待访问者依次要访问的柱面为130、199、32、159、15、148、61、99,那么,当50号柱面上的操作结束后,移动臂将按请求的先后次序先移到130号柱面,最后到达99号柱面。
采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。
先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。
2.短寻道时间优先算法(SSTF
最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。
现在仍利用同一个例子来讨论,现在当50号柱面的操作结束后,应该先处理61号柱面的请求,然后到达32号柱面执行操作,随后处理15号柱面请求,后继操作的次序应该是99、130、148、159、199。
采用最短寻找时间优先算法决定等待访问者执行操作的次序时,读写磁头总
共移动了200多个柱面的距离,与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。
但最短查找时间优先(SSTF调度,FCFS会引起读写头在盘面上的大范围移动,SSTF查找距离磁头最短(也就是查找时间最短)的请求作为下一次服务的对象。
SSTF查找模式有高度局部化的倾向,会推迟一些请求的服务,甚至引起无限拖延(又称饥饿)。
①先来先服务算法(FCFS流程图:
输入磁道号
按输入顺序将磁道序列输出
求平均寻道长度
输出移动的平均磁道数
②最短寻道时间优先算法(SSTF流程图:
尸"
1
输出排好序的磁道序列
LJ
三、总体验证
1、数据结构及信号量定义的说明;
本系统划分为四个模块:
先来先服务算法模块voidFCFS(intarray[],int
m)、最短寻道时间优先算法模块voidSSTF(intarray[],intm)、扫描算法模
块voidSCAN(intarray[],intm)和循环扫描算法模块:
voidCSCAN(int
array[],intm)。
2.先来先服务算法模块:
voidFCFS(intarray[],intm)
输入磁道号,按先来先服务的策略输出磁盘请求序列,求平均寻道长度,输
出移动平均磁道数。
3、最短寻道时间优先算法模块:
voidSSTF(intarray[],intm)
将磁道号用冒泡法从小到大排序,输出排好序的磁道序列,输入当前磁道号,根据前磁道在已排的序列中的位置,选择扫描的顺序,求出平均寻道长度,输出移动的平均磁道数。
4、代码分析
1、先来先服务算法模块:
voidFCFS(intarray[],intm)
主要代码:
for(i=0,j=1;
j<
m;
i++,j++)
{
sum+=abs(array[j]-array[i]);
ave=(float)(sum)/(float)(m);
}
2最短寻道时间优先算法模块:
for(i=0;
i<
i++)/*使用冒泡法按从小到大顺序排列*/
for(j=i+1;
j++)
if(array[i]>
array[j])
temp=array[i];
array[i]=array[j];
array[j]=temp;
if(array[m-1]<
=now)/*若当前磁道号大于请求序列中最大者,则直接由外向内
依次给予各请求服务*/
for(i=m-1;
i>
=0;
i--)
cout<
<
array[i]<
"
;
sum=now-array[0];
elseif(array[0]>
=now)/*若当前磁道号小于请求序列中最小者,则直接由内向
外依次给予各请求服务*/
while((l>
=0)&
&
(r<
m))/*当前磁道在请求序列范围内*/
if((now-array[l])<
=(array[r]-now))/*选择与当前磁道最近的请求
给予服务*/
array[l]<
sum+=now-array[l];
now=array[l];
1=1-1;
3、实验的步骤;
1先来先服务算法
输入磁道序列:
55583918901601503818百前磁道号:
100
2最短寻道时间优先算法
(1)当前磁道号大于磁道序列中的最大的磁道号时
(2)输入磁道序列:
555839189016015038184当前磁道号:
单链表显示
微软拼音简捷半
xxxl,来生服务Si^FCFS
xxxi,量短寻道时问优先算谀彌TFxxxQ,jg出
500(请选择:
.
链表长度为:
9
*******先来先服务的寻道顺序是
3918S6
平均寻道长度占5.333332
«
****«
退岀请选0,继续请选1,2
pOOCMX科資疑疑賢JK5CX弭磁盘调
林先来先服务算■法F(TS
***2,最短寻道时间优先算法話TF
xx*0.ii出
>
00(请选择:
/hxxx^m你迤择了:
負来先服鱼算.法FCF2薄驀瞬脅梵MM新建一个单琏表,以®
作为錯束标志:
和杯“朴
5553391®
3QICO15038184Q
HNXKXK^几号磯道开始:
J4MMMMMMM10O
单链表显示:
阳533918901G0
r
-
D:
\软{^MicrosoftVisualStudio\MyProjects\5\Debug\5exe
四、源代码:
#include<
iostream>
cmath>
#include<
stdio.h>
usingnamespacestd;
typedefstructnode
intdata;
structnode*next;
}Node,*Linklist;
voidmain()
voidCreate_Linklist(Node*);
voidfcfs();
〃声明先来先服务函数FCFSvoidsstf();
〃声明最短寻道时间优先函数sstfvoidprint(Node*);
ints;
printf("
\t***1,先来先服务算法FCFS\n"
);
\t***2,最短寻道时间优先算法SSTF\n"
\t***0,退出\n"
\t***请选择:
while(s!
=O){
switch(s)
case1:
printf("
\t\t********你选择了:
先来先服务算法
FCFS\n"
fcfs();
break;
case2:
\t\t******你选择了:
最短寻道时间优先算法
SSTF\n"
sstf();
\t\t*******退出请选0,继续请选1,2,\n"
scanf("
%d"
&
s);
}voidfcfs()//先来先服务算法
voidCreate_Linklist(Node*);
voidprint(Node*);
intLength_Linklist(Node*);
Node*l,*head;
//*m,*n;
*/
floatnum=0;
//num为平均寻道长度
intc,f;
head=(Node*)malloc(sizeof(Node));
head->
next=NULL;
**************新建一个单链表,以0作为结束标志:
********、n"
Create_Linklist(head);
c=Length_Linklist(head);
\t\t******从几号磁道开始:
********"
f);
//f为磁道号
print(head);
\t***链表长度为:
%d\n"
c);
l=head->
next;
for(inti=0;
c;
i++)
num+=abs(l->
data-f);
f=l->
data;
l=l->
num=num/c;
\t\t*****先来先服务的寻道顺序是:
\n"
\t\t******平均寻道长度:
%f\n"
num);
/*****************************************************************/
voidsstf()〃最短寻道时间优先算法
voidprint(Node*);
Node*p,*q,*r,*s,*l,*m,*head;
Create_Linklist(head);
c=Length_Linklist(head);
//f为磁道号
l=(Node*)malloc(sizeof(Node));
l->
m=l;
q=head;
p=head->
next;
s=head;
r=head->
intmin=abs(f-r->
data);
for(intj=0;
c-i-1;
p=p->
q=q->
if(abs(f-p->
data)<
min)
min=abs(f-p->
r=p;
s=q;
num+=abs(f-r->
f=r->
s->
next=r->
r->
next=NULL;
m->
next=r;
m=r;
p=head->
s=head;
}num=num/c;
\t\t******最短寻道时间优先顺序是:
print(l);
\t\t*********平均寻道长度:
/*********************************************************/
voidprint(Node*head)//输出链表
Node*p;
coutvv"
单链表显示:
if(p==NULL)
单链表为空:
elseif(p->
next==NULL)
printf("
%d\t"
p->
else
while(p->
next!
=NULL)
p=p->
void
Create_Linklist(Node*head)〃创建链表
{_
Node*p,*q;
inti;
scanf("
i);
while(i!
=0)
p=(Node*)malloc(sizeof(Node));
p->
p->
data=i;
q->
next=p;
q=p;
cin>
>
i;
}/*c++;
/**************************************************
intLength_Linklist(Node*head)//计算链表长{_
intl;
p=head->
l=1;
next)
l++;
returnl;
五、总结
通过此次课程设计,我对操作系统的基础知识了解得更透彻了,同时对磁盘调度的四种算法一一先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、有了更深刻的理解和掌握,使我能够为磁盘调度选择适当的算法,提高CPU工作效率。
设计过程中遇到的困难在老师和同学的帮助下顺利解决并通过了验收,我深刻认识到算法的逻辑性对程序的重要影响,算法的准确度对程序运行结果的重要影响,这对我以后在操作系统的学习中有极大帮助。
六、参考资料
[1]黄维通等.VisualC++面向对象与可视化程序设计.北京:
清华大
学出版社,2011.
[2]郑宗汉等.算法设计与分析.北京:
清华大学出版社,2005.
[3]赵剑云等译,[美]GeorgeShepherd等著.深入解析MFC.北京:
中
国电力出版社,2003.
[4]MicrosoftPlatformSDK,August2001Edition.