磁盘调度算法的模拟实现课程设计报告.docx

上传人:b****6 文档编号:8603255 上传时间:2023-02-01 格式:DOCX 页数:13 大小:99.40KB
下载 相关 举报
磁盘调度算法的模拟实现课程设计报告.docx_第1页
第1页 / 共13页
磁盘调度算法的模拟实现课程设计报告.docx_第2页
第2页 / 共13页
磁盘调度算法的模拟实现课程设计报告.docx_第3页
第3页 / 共13页
磁盘调度算法的模拟实现课程设计报告.docx_第4页
第4页 / 共13页
磁盘调度算法的模拟实现课程设计报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

磁盘调度算法的模拟实现课程设计报告.docx

《磁盘调度算法的模拟实现课程设计报告.docx》由会员分享,可在线阅读,更多相关《磁盘调度算法的模拟实现课程设计报告.docx(13页珍藏版)》请在冰豆网上搜索。

磁盘调度算法的模拟实现课程设计报告.docx

磁盘调度算法的模拟实现课程设计报告

淮北师范大学

操作系统课程设计

磁盘调度算法的模拟实现

学院计算机科学与技术

专业计算机科学与技术(师范)

学号

学生姓名

指导教师姓名

2015年7月1日

引言2

总体设计错误!

未定义书签。

3.具体内容3

三、实验验证5

1.结果截图7

2.代码分析6

四、源代码9

五、总结3

六、参考资料3

、引言

1、课程设计的目的:

操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。

进一步巩固和复习操作系统的基础知识。

培养学生结构化程序、模块化程序设计的方法和能力。

提高学生调试程序的技巧和软件设计的能力。

提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。

2、设计内容:

设计并实现一个本别利用下列磁盘调度算法进行磁盘调度的模拟程序。

1、先来先服务耳法FCFS

2、摂短口道时闾优先慕法SSTF

3、设计要求:

1.磁头初始磁道号,序列长度,磁道号序列等数据可从键盘输入,也可从文件读入。

2.最好能实现磁道号序列中磁道号的动态增加。

3.磁道访问序列以链表的形式存储

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

{

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

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

}

2最短寻道时间优先算法模块:

voidSSTF(intarray[],intm)

主要代码:

for(i=0;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<

sum=now-array[0];

}

elseif(array[0]>=now)/*若当前磁道号小于请求序列中最小者,则直接由内向

外依次给予各请求服务*/

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

{

if((now-array[l])<=(array[r]-now))/*选择与当前磁道最近的请求

给予服务*/

{

cout<

sum+=now-array[l];

now=array[l];

1=1-1;

}

3、实验的步骤;

1先来先服务算法

输入磁道序列:

55583918901601503818百前磁道号:

100

2最短寻道时间优先算法

(1)当前磁道号大于磁道序列中的最大的磁道号时

(2)输入磁道序列:

555839189016015038184当前磁道号:

100

单链表显示

微软拼音简捷半

微软拼音简捷半

xxxl,来生服务Si^FCFS

xxxi,量短寻道时问优先算谀彌TFxxxQ,jg出

500(请选择:

.

链表长度为:

9

*******先来先服务的寻道顺序是

3918S6

平均寻道长度占5.333332

«****««退岀请选0,继续请选1,2

pOOCMX科資疑疑賢JK5CX弭磁盘调

林先来先服务算■法F(TS

***2,最短寻道时间优先算法話TF

xx*0.ii出

>00(请选择:

1

/hxxx^m你迤择了:

負来先服鱼算.法FCF2薄驀瞬脅梵MM新建一个单琏表,以®作为錯束标志:

和杯“朴

5553391®3QICO15038184Q

HNXKXK^几号磯道开始:

J4MMMMMMM10O

单链表显示:

阳533918901G0

r

-

D:

\软{^MicrosoftVisualStudio\MyProjects\5\Debug\5exe

 

四、源代码:

#include

#include

#include

usingnamespacestd;

typedefstructnode

{

intdata;

structnode*next;

}Node,*Linklist;

voidmain()

{

voidCreate_Linklist(Node*);

voidfcfs();〃声明先来先服务函数FCFSvoidsstf();〃声明最短寻道时间优先函数sstfvoidprint(Node*);

ints;

printf("\t***1,先来先服务算法FCFS\n");

printf("\t***2,最短寻道时间优先算法SSTF\n");

printf("\t***0,退出\n");

printf("\t***请选择:

");

while(s!

=O){

switch(s)

{

case1:

printf("\t\t********你选择了:

先来先服务算法

FCFS\n");fcfs();break;

case2:

printf("\t\t******你选择了:

最短寻道时间优先算法

SSTF\n");sstf();break;

}

printf("\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;

printf("**************新建一个单链表,以0作为结束标志:

********、n");

Create_Linklist(head);

c=Length_Linklist(head);

printf("\t\t******从几号磁道开始:

********");

scanf("%d",&f);//f为磁道号

print(head);

printf("\t***链表长度为:

%d\n",c);

l=head->next;

for(inti=0;i

{

num+=abs(l->data-f);f=l->data;l=l->next;

}

num=num/c;

printf("\t\t*****先来先服务的寻道顺序是:

\n");

print(head);

printf("\t\t******平均寻道长度:

%f\n",num);

}

/*****************************************************************/

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

{

voidCreate_Linklist(Node*);

voidprint(Node*);

intLength_Linklist(Node*);

Node*p,*q,*r,*s,*l,*m,*head;

intc,f;

head=(Node*)malloc(sizeof(Node));head->next=NULL;

printf("**************新建一个单链表,以0作为结束标志:

********、n");

Create_Linklist(head);c=Length_Linklist(head);

printf("\t\t******从几号磁道开始:

********");

scanf("%d",&f);//f为磁道号

print(head);

printf("\t***链表长度为:

%d\n",c);

l=(Node*)malloc(sizeof(Node));

l->next=NULL;m=l;

q=head;p=head->next;

s=head;r=head->next;

floatnum=0;

for(inti=0;i

{

intmin=abs(f-r->data);

for(intj=0;j

{

p=p->next;

q=q->next;

if(abs(f-p->data)

{

min=abs(f-p->data);

r=p;

s=q;

}

}

num+=abs(f-r->data);

f=r->data;

s->next=r->next;

r->next=NULL;

m->next=r;

m=r;

q=head;

p=head->next;s=head;r=head->next;

}num=num/c;

printf("\t\t******最短寻道时间优先顺序是:

\n");

print(l);

printf("\t\t*********平均寻道长度:

%f\n",num);

}

/*********************************************************/

voidprint(Node*head)//输出链表

{

Node*p;

p=head->next;coutvv"单链表显示:

";if(p==NULL)

{

printf("单链表为空:

\n");

}

elseif(p->next==NULL)

{

printf("%d\t",p->data);

printf("\n");

}

else

{

while(p->next!

=NULL)

{

printf("%d\t",p->data);p=p->next;

}

printf("%d\t",p->data);

printf("\n");

}

}

void

/*********************************************************/

Create_Linklist(Node*head)〃创建链表

{_

Node*p,*q;

inti;

scanf("%d",&i);

q=head;

while(i!

=0)

{

p=(Node*)malloc(sizeof(Node));p->next=NULL;

p->data=i;

q->next=p;

q=p;

cin>>i;

}/*c++;*/

}

/**************************************************

intLength_Linklist(Node*head)//计算链表长{_

intl;

Node*p;

p=head->next;

l=1;

while(p->next)

{

p=p->next;

l++;

}

returnl;

}

五、总结

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

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

六、参考资料

[1]黄维通等.VisualC++面向对象与可视化程序设计.北京:

清华大

学出版社,2011.

[2]郑宗汉等.算法设计与分析.北京:

清华大学出版社,2005.

[3]赵剑云等译,[美]GeorgeShepherd等著.深入解析MFC.北京:

国电力出版社,2003.

[4]MicrosoftPlatformSDK,August2001Edition.

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

当前位置:首页 > 高等教育 > 工学

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

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