模拟磁盘调度算法系统的设计毕业设计.docx
《模拟磁盘调度算法系统的设计毕业设计.docx》由会员分享,可在线阅读,更多相关《模拟磁盘调度算法系统的设计毕业设计.docx(27页珍藏版)》请在冰豆网上搜索。
模拟磁盘调度算法系统的设计毕业设计
目录
一、设计任务及主要技术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算法同时考虑下一个作业磁道请求与当前磁头位