模拟磁盘调度算法系统的设计毕业设计.docx

上传人:b****3 文档编号:6242581 上传时间:2023-05-09 格式:DOCX 页数:27 大小:323.15KB
下载 相关 举报
模拟磁盘调度算法系统的设计毕业设计.docx_第1页
第1页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第2页
第2页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第3页
第3页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第4页
第4页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第5页
第5页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第6页
第6页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第7页
第7页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第8页
第8页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第9页
第9页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第10页
第10页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第11页
第11页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第12页
第12页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第13页
第13页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第14页
第14页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第15页
第15页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第16页
第16页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第17页
第17页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第18页
第18页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第19页
第19页 / 共27页
模拟磁盘调度算法系统的设计毕业设计.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

模拟磁盘调度算法系统的设计毕业设计.docx

《模拟磁盘调度算法系统的设计毕业设计.docx》由会员分享,可在线阅读,更多相关《模拟磁盘调度算法系统的设计毕业设计.docx(27页珍藏版)》请在冰点文库上搜索。

模拟磁盘调度算法系统的设计毕业设计.docx

模拟磁盘调度算法系统的设计毕业设计

 目录

一、设计任务及主要技术3

二、设计方案及论证结果4

三、系统的原理框图5

四、设计程序12

五、实验结果20

六、调试分析及故障处理24

七、设计结论25

八、心得体会26

 

1、设计任务及主要技术

1.整体功能概述(设计任务):

磁盘是外设中一个很常用的部分,所以,对磁盘数据的寻道时间的长短可以直接影响机器的整体运行速度的快慢。

本设计为一个模拟磁盘调度算法的磁盘调度模拟系统,能够模拟先来先服务(FCFS)算法、最短寻道时间(SSTF)算法、电梯(SCAN)算法、环形扫描(C_SCAN)算法及N_SCAN算法五个磁盘调度算法,输入为一组作业的磁道请求,输出为按选择的算法执行时的磁头移动轨迹。

其中,先来先服务(FCFS)算法、最短寻道时间(SSTF)算法、电梯(SCAN)算法为基本算法,环形扫描(C_SCAN)算法及N_SCAN算法为扩展算法。

 

2.运行环境:

(1)硬件环境Intelcorei5CPU

(2)软件环境Windows7MicrosoftVisualC++6.0

3.主要技术:

(1)用C语言编写程序;

(2)对编程软件MicrosoftVisualC++6.0的了解和使用;

(3)操作系统基础知识(主要是对先来先服务(FCFS)算法、最短寻道时间(SSTF)算法、电梯(SCAN)算法的了解);

(4)操作系统扩展知识(通过网络自学环形扫描(C_SCAN)算法及N_SCAN算法)。

二、设计方案及论证结果

1.设计方案:

(1)先来先服务算法(First-Come,First-Served,FCFS)

此算法为一种最简单的磁盘调度算法。

它直接根据作业请求磁盘的先后顺序对磁盘进行寻访。

此算法公平、简单,每个作业的磁盘请求都可以得到处理,不会出现某个作业的请求长期得不到满足的情况。

但此算法未对寻道方案进行优化,故平均周转时间及带权周转时间都会较长。

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

此算法优先选择距离当前磁头位置最近的作业磁道请求。

此算法可以使得每次寻道时所用的时间都最短,但不能保证平均周转时间及带权周转时间最短。

(3)电梯算法(SCAN)

此算法同时考虑下一个作业磁道请求与当前磁头位置的距离和当前磁头移动方向。

本设计默认磁头当前移动方向为自内向外,故SCAN算法先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,再将磁臂换向,访问磁头内侧距离当前磁头位置最近的作业磁道请求。

此算法避免了饥饿现象的出现,每个作业的磁盘请求都可以得到处理,且使每次寻道时间相对较短。

(4)环形扫描算法(C_SCAN)

此算法磁头移动方向一直为自内向外,同时考虑下一个作业磁道请求与当前磁头位置的距离最短。

先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,再直接将磁头移到最内侧磁道(此过程快速移动,并不访问任何磁道),再由内向外顺次访问距离当前磁头位置最近的作业磁道请求。

此算法每个作业的磁盘请求都可以得到处理,且使每次寻道时间相对较短。

由于该方法一直保持磁头移动寻访方向不变,对两端磁道请求比较有利。

(5)N_SCAN算法

此算法同时考虑下一个作业磁道请求与当前磁头位置的距离和当前磁头移动方向,但每次磁臂调转方向时,将同时处理在磁头向一侧移动过程当中输入的作业请求。

本设计默认磁头当前移动方向为自内向外,先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,接下来一并考虑在磁头向外侧移动过程当中输入的作业请求与磁头内侧未被处理的作业磁道请求。

此算法对中间磁道请求比较有利。

2.论证结果:

本设计输入当前磁头位置及一组作业磁道请求。

选择所需的算法,输出相应结果:

(1)先来先服务算法(FCFS)

按输入顺序输出访问序列。

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

依次输出距离当前磁头位置最近的磁道请求。

(3)电梯算法(SCAN)

先按照从小到大的顺序输出所输入的当前磁头位置外侧的磁道请求,再按照从大到小的顺序输出所输入的当前磁头位置内侧的磁道请求。

(4)环形扫描算法(C_SCAN)

先按照从小到大的顺序输出所输入的当前磁头位置外侧的磁道请求,再按照从小到大的顺序输出所输入的当前磁头位置内侧的磁道请求。

(5)N_SCAN算法

先按照从小到大的顺序输出所输入的当前磁头位置外侧的磁道请求,再按照从大到小的顺序输出在磁头向外侧移动过程当中输入的作业请求与所输入的当前磁头位置内侧的磁道请求。

三、系统的原理框图

1.总体框图:

本系统划分为五个模块:

先来先服务算法模块FCFS(inttrack[])、最短寻道时间算法模块SSTF(intcorrenttrack,inttrack[])、电梯算法模块SCAN(intcorrenttrack,inttrack[])、环形扫描算法模块C_SCAN(intcorrenttrack,inttrack[])及N_SCAN算法模块N_SCAN(intcorrenttrack,inttrack[])。

总体框图:

图1总体框图

2.模块框图:

(1)先来先服务算法模块voidFCFS(inttrack[])

直接根据作业请求磁盘的先后顺序对磁盘进行寻访。

此算法公平、简单,每个作业的磁盘请求都可以得到处理,不会出现某个作业的请求长期得不到满足的情况。

先来先服务算法流程图:

图2先来先服务算法模块流程图

 

(2)最短寻道时间优先算法模块voidSSTF(intcorrenttrack,inttrack[])

优先选择距离当前磁头位置最近的作业磁道请求,可以使得每次寻道时所用的时间都最短。

 

最短寻道时间优先算法流程图:

图3最短寻道时间优先算法模块流程图

(3)电梯算法模块voidSCAN(intcorrenttrack,inttrack[])

默认磁头当前移动方向为自内向外,先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,再将磁臂换向,访问磁头内侧距离当前磁头位置最近的作业磁道请求。

电梯算法流程图:

图4电梯算法模块流程图

(4)环形扫描算法模块voidC_SCAN(intcorrenttrack,inttrack[])

先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,再直接将磁头移到最内侧磁道(此过程快速移动,并不访问任何磁道),再由内向外顺次访问距离当前磁头位置最近的作业磁道请求。

一直保持磁头移动寻访方向不变,对两端磁道请求比较有利。

环形扫描算法流程图:

图5环形扫描算法模块流程图

(5)N_SCAN算法模块voidN_SCAN(intcorrenttrack,inttrack[])

本设计默认磁头当前移动方向为自内向外,先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,接下来一并考虑在磁头向外侧移动过程当中输入的作业请求与磁头内侧未被处理的作业磁道请求。

此算法对中间磁道请求比较有利。

N_SCAN算法流程图:

图6N_SCAN算法模块流程图

(1)

图7N_SCAN算法模块流程图

(2)

四、设计程序

1.主要模块代码:

(1)先来先服务算法voidFCFS(inttrack[])

直接根据作业请求磁盘的先后顺序对磁盘进行寻访。

先来先服务算法代码:

voidFCFS(inttrack[])

{

intk;

for(k=0;k<9;k++)

{

printf("%d->",track[k]);

}

printf("%d",track[9]);

}

(2)最短寻道时间优先算法voidSSTF(intcorrenttrack,inttrack[])

优先选择距离当前磁头位置最近的作业磁道请求。

最短寻道时间优先算法代码:

voidSSTF(intcorrenttrack,inttrack[])

{

intLine[10];

inti;

intj;

intd;

intmin_d;

intk;

intcorrent;

min_d=abs(correnttrack-track[0]);

k=0;

corrent=correnttrack;

for(i=0;i<10;i++)

{

for(j=0;j<10;j++)

{

if(track[j]!

=-1)

{

d=abs(corrent-track[j]);

if(d

{

min_d=d;

k=j;

}

}

}

Line[i]=track[k];

corrent=Line[i];

track[k]=-1;

min_d=65536;

}

printf("%d->",correnttrack);

Print(Line);

}

(3)电梯算法voidSCAN(intcorrenttrack,inttrack[])

默认磁头当前移动方向为自内向外,先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,再将磁臂换向,访问磁头内侧距离当前磁头位置最近的作业磁道请求。

电梯算法代码:

voidSCAN(intcorrenttrack,inttrack[])

{

intLine[10];

intdLine[10];

inti;

intj;

intk;

intmin;

k=0;

min=track[0];

for(i=0;i<10;i++)

{

for(j=0;j<10;j++)

{

if(track[j]!

=-1)

{

if(track[j]

{

min=track[j];

k=j;

}

}

}

dLine[i]=track[k];

track[k]=-1;

min=65536;

}

k=0;

for(i=0;i<10;i++)

{

if(correnttrack>dLine[i])

{

k=k+1;

}

}

j=k;

for(i=0;i<10-k;i++)

{

Line[i]=dLine[j];

j=j+1;

}

j=k-1;

for(i=10-k;i<10;i++)

{

Line[i]=dLine[j];

j=j-1;

}

Print(Line);

}

(4)环形扫描算法voidC_SCAN(intcorrenttrack,inttrack[])

先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,再直接将磁头移到最内侧磁道(此过程快速移动,并不访问任何磁道),再由内向外顺次访问距离当前磁头位置最近的作业磁道请求。

环形扫描算法代码:

voidC_SCAN(intcorrenttrack,inttrack[])

{

intLine[10];

intdLine[10];

inti;

intj;

intk;

intmin;

k=0;

min=track[0];

for(i=0;i<10;i++)

{

for(j=0;j<10;j++)

{

if(track[j]!

=-1)

{

if(track[j]

{

min=track[j];

k=j;

}

}

}

dLine[i]=track[k];

track[k]=-1;

min=65536;

}

k=0;

for(i=0;i<10;i++)

{

if(correnttrack>dLine[i])

{

k=k+1;

}

}

j=k;

for(i=0;i<10-k;i++)

{

Line[i]=dLine[j];

j=j+1;

}

j=0;

for(i=10-k;i<10;i++)

{

Line[i]=dLine[j];

j=j+1;

}

Print(Line);

}

(5)N_SCAN算法voidN_SCAN(intcorrenttrack,inttrack[])

默认磁头当前移动方向为自内向外,先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,接下来一并考虑在磁头向外侧移动过程当中输入的作业请求与磁头内侧未被处理的作业磁道请求。

N_SCAN算法

voidN_SCAN(intcorrenttrack,inttrack[])

{

intLine[10];

intdLine[10];

intlLine[10];

inti;

intj;

intk;

intmin,max;

intchoice;

for(k=0;k<10;k++)

{

lLine[k]=-1;

}

k=0;

min=track[0];

for(i=0;i<10;i++)

{

for(j=0;j<10;j++)

{

if(track[j]!

=-1)

{

if(track[j]

{

min=track[j];

k=j;

}

}

}

dLine[i]=track[k];

track[k]=-1;

min=65536;

}

k=0;

for(i=0;i<10;i++)

{

if(correnttrack>dLine[i])

{

k=k+1;

}

}

j=k;

for(i=0;i<10-k;i++)

{

Line[i]=dLine[j];

printf("%d->",Line[i]);

Line[i]=-1;

j=j+1;

}

j=k-1;

for(i=10-k;i<10;i++)

{

Line[i]=dLine[j];

j=j-1;

}

printf("\n是否还有作业请求(1-是;0-否):

\n");

scanf("%d",&choice);

k=9-k;

while(choice==1)

{

printf("\n请输入作业的磁道请求:

\n");

scanf("%d",&Line[k]);

k=k-1;

printf("\n是否还有作业请求(1-是;0-否):

\n");

scanf("%d",&choice);

}

printf("\n磁头继续移动轨迹为:

\n");

k=9;

max=Line[9];

for(i=0;i<10;i++)

{

for(j=0;j<10;j++)

{

if(Line[j]>max)

{

max=Line[j];

k=j;

}

}

lLine[i]=Line[k];

Line[k]=-1;

max=0;

}

for(i=0;i<9;i++)

{

if(lLine[i]!

=-1)

{

printf("%d->",lLine[i]);

}

}

printf("%d",lLine[9]);

}

2.总模块代码:

voidmain()

{

inttrack[10];

intn;

intcorrenttrack;

intchoice=1;

printf("\n******磁盘调度模拟系统******");

while(choice==1)

{

printf("\n请输入当前磁道号:

");

scanf("%d",&correnttrack);

printf("\n请输入一组作业的磁道请求<以回车分隔>:

\n");

scanf("%d%d%d%d%d%d%d%d%d%d",

&track[0],&track[1],&track[2],&track[3],&track[4],

&track[5],&track[6],&track[7],&track[8],&track[9]);

printf("\n请选择算法:

\n");

printf("\t1.先来先服务算法(FCFS)\n");

printf("\t2.最短寻道时间优先算法(SSTF)\n");

printf("\t3.电梯算法(SCAN)\n");

printf("\t4.环形扫描算法(C_SCAN)\n");

printf("\t5.(N_SCAN)\n");

scanf("%d",&n);

printf("\n\n");

switch(n)

{

case1:

printf("********先来先服务算法(FCFS)*********\n磁头移动轨迹为:

\n");

FCFS(track);

break;

case2:

printf("*****最短寻道时间优先算法(SSTF)******\n磁头移动轨迹为:

\n");

SSTF(correnttrack,track);

break;

case3:

printf("************电梯算法(SCAN)***********\n磁头移动轨迹为:

\n");

SCAN(correnttrack,track);

break;

case4:

printf("*********环形扫描算法(C_SCAN)********\n磁头移动轨迹为:

\n");

C_SCAN(correnttrack,track);

break;

case5:

printf("****************N_SCAN***************\n磁头移动轨迹为:

\n");

N_SCAN(correnttrack,track);

break;

}

printf("\n请问是否继续?

(1-继续;0-退出)\n");

scanf("%d",&choice);

}

}

五、实验结果

1.总模块实验结果:

程序开始运行,将出现输入选择界面;

图8主界面

 

2.基础模块实验结果:

(1)先来先服务算法(First-Come,First-Served,FCFS)

按输入顺序输出访问序列。

选择该算法后,将输出相应磁头移动轨迹:

图9先来先服务算法0

输出结果为69->23->120->45->77->31->55->99->150->2满足要求。

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

依次输出距离当前磁头位置最近的磁道请求。

选择该算法后,将输出相应磁头移动轨迹:

图10最短寻道优先算法

输出结果为45->55->69->77->99->120->150->31->23->2满足要求。

(3)电梯算法(SCAN)

先按照从小到大的顺序输出所输入的当前磁头位置外侧的磁道请求,再按照从大到小的顺序输出所输入的当前磁头位置内侧的磁道请求。

选择该算法后,将输出相应磁头移动轨迹:

图11电梯算法

输出结果为55->69->77->99->120->150->45->31->23->2满足要求。

3.扩展模块实验结果:

(1)环形扫描算法(C_SCAN)

先按照从小到大的顺序输出所输入的当前磁头位置外侧的磁道请求,再按照从小到大的顺序输出所输入的当前磁头位置内侧的磁道请求。

选择该算法后,将输出相应磁头移动轨迹:

图12环形扫描算法

输出结果为55->69->77->99->120->150->2->23->31->45满足要求。

 

(2)N_SCAN算法

先按照从小到大的顺序输出所输入的当前磁头位置外侧的磁道请求,再按照从大到小的顺序输出在磁头向外侧移动过程当中输入的作业请求与所输入的当前磁头位置内侧的磁道请求。

选择该算法后,将输出相应磁头移动轨迹:

图13N_SCAN算法

输出结果为55->69->77->99->120->150->88->45->31->23->8->2->1满足要求。

六、调试分析及故障处理

1.调试分析:

(1)在代码中错误的使用了中文括号“)”,导致程序出错。

图14错误报告

(2)在定义函数时误在结尾处加分号“;”,导致调试过程中出错。

图15错误报告

 

(3)由于未对变量初始化,导致错误:

图16错误警告

未对k初始化,如下图:

图17变量表

 

2.故障处理:

重新检查代码,发现错误,并及时修正。

调试后无误:

图18无错误及警告

发生故障时,可采取单步调试的方法,逐条语句检查,修正错误。

图19故障处理过程

 

七、设计结论

磁盘,是一种很重要也很常用的外设,其分配也有一定的分配策略。

在操作系统中,作业对磁盘的请求常常要排队,由此需要一些高效率的磁盘分配策略算法。

本系统设计了五种寻道策略,其中先来先服务算法为一种最简单的磁盘调度算法,它直接根据作业请求磁盘的先后顺序对磁盘进行寻访,公平、简单,每个作业的磁盘请求都可以得到处理,不会出现某个作业的请求长期得不到满足的情况,但未对寻道方案进行优化,故平均周转时间及带权周转时间都会较长;最短寻道时间优先算法优先选择距离当前磁头位置最近的作业磁道请求,可以使得每次寻道时所用的时间都最短,但不能保证平均周转时间及带权周转时间最短;电梯算法同时考虑下一个作业磁道请求与当前磁头位置的距离和当前磁头移动方向先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,再将磁臂换向,访问磁头内侧距离当前磁头位置最近的作业磁道请求,避免了饥饿现象的出现,每个作业的磁盘请求都可以得到处理,且使每次寻道时间相对较短;环形扫描算法的磁头移动方向一直为自内向外,同时考虑下一个作业磁道请求与当前磁头位置的距离最短,先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,再直接将磁头移到最内侧磁道(此过程快速移动,并不访问任何磁道),再由内向外顺次访问距离当前磁头位置最近的作业磁道请求,使每个作业的磁盘请求都可以得到处理,且使每次寻道时间相对较短,由于该方法一直保持磁头移动寻访方向不变,对两端磁道请求比较有利;N_SCAN算法同时考虑下一个作业磁道请求与当前磁头位

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

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2