模拟磁盘调度算法系统的设计毕业设计_磁盘调度算法课程设计
模拟磁盘调度算法系统的设计毕业设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“磁盘调度算法课程设计”。
目录
一、设计任务及主要技术....................................................................3
二、设计方案及论证结果....................................................................4
三、系统的原理框图..................................................................................5
四、设计程序....................................................................................................12
五、实验结果....................................................................................................20
六、调试分析及故障处理..................................................................24
七、设计结论....................................................................................................25
八、心得体会....................................................................................................26
一、设计任务及主要技术
1.整体功能概述(设计任务):
磁盘是外设中一个很常用的部分,所以,对磁盘数据的寻道时间的长短可以直接影响机器的整体运行速度的快慢。本设计为一个模拟磁盘调度算法的磁盘调度模拟系统,能够模拟先来先服务(FCFS)算法、最短寻道时间(SSTF)算法、电梯(SCAN)算法、环形扫描(C_SCAN)算法及N_SCAN算法五个磁盘调度算法,输入为一组作业的磁道请求,输出为按选择的算法执行时的磁头移动轨迹。其中,先来先服务(FCFS)算法、最短寻道时间(SSTF)算法、电梯(SCAN)算法为基本算法,环形扫描(C_SCAN)算法及N_SCAN算法为扩展算法。
2.运行环境:
(1)硬件环境
Intel core i5 CPU
(2)软件环境
Windows 7
Microsoft Visual C++ 6.0
3.主要技术:
(1)用C语言编写程序;
(2)对编程软件Microsoft Visual C++ 6.0的了解和使用;
(3)操作系统基础知识(主要是对先来先服务(FCFS)算法、最短寻道时间(SSTF)算法、电梯(SCAN)算法的了解);
(4)操作系统扩展知识(通过网络自学环形扫描(C_SCAN)算法及N_SCAN算法)。
二、设计方案及论证结果
1.设计方案:
(1)先来先服务算法(First-Come,First-Served,FCFS)
此算法为一种最简单的磁盘调度算法。它直接根据作业请求磁盘的先后顺序对磁盘进行寻访。此算法公平、简单,每个作业的磁盘请求都可以得到处理,不会出现某个作业的请求长期得不到满足的情况。但此算法未对寻道方案进行优化,故平均周转时间及带权周转时间都会较长。
(2)最短寻道时间优先算法(Shortest Seek Time First,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(int track[])、最短寻道时间算法模块SSTF(int correnttrack,int track[])、电梯算法模块SCAN(int correnttrack,int track[])、环形扫描算法模块C_SCAN(int correnttrack,int track[])及N_SCAN算法模块N_SCAN(int correnttrack,int track[])。
总体框图:
磁盘调度模拟系统先来先服务算法最短寻道时间优先算法电梯算法环形扫描算法N_SCAN算法 图1 总体框图2.模块框图:
(1)先来先服务算法模块void FCFS(int track[])直接根据作业请求磁盘的先后顺序对磁盘进行寻访。此算法公平、简单,每个作业的磁盘请求都可以得到处理,不会出现某个作业的请求长期得不到满足的情况。
先来先服务算法流程图:
FCFS输入当前磁头位置 输入一组作业磁道请求i=1i
图2 先来先服务算法模块流程图
(2)最短寻道时间优先算法模块void SSTF(int correnttrack,int track[])优先选择距离当前磁头位置最近的作业磁道请求,可以使得每次寻道时所用的时间都最短。
最短寻道时间优先算法流程图:
SSTF输入当前磁头位置及 一组作业磁道请求Min=|corrent-track[0]|i=0i
图3最短寻道时间优先算法模块流程图
(3)电梯算法模块void SCAN(int correnttrack,int track[])默认磁头当前移动方向为自内向外,先选择当前磁头之外距离其最近的磁道进行访问,6 直到再无更外的磁道请求,再将磁臂换向,访问磁头内侧距离当前磁头位置最近的作业磁道请求。
电梯算法流程图:
C_SCANk=0;min=track[0]i=0idLine[i]是k=k+1;否否i++j=k;i=0;i
图4 电梯算法模块流程图
(4)环形扫描算法模块void C_SCAN(int correnttrack,int track[])先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,再直接将 7 磁头移到最内侧磁道(此过程快速移动,并不访问任何磁道),再由内向外顺次访问距离当前磁头位置最近的作业磁道请求。一直保持磁头移动寻访方向不变,对两端磁道请求比较有利。
环形扫描算法流程图:
C_SCANk=0;min=track[0]i=0idLine[i]是k=k+1;否否i++j=k;i=0;i
图5 环形扫描算法模块流程图
(5)N_SCAN算法模块void N_SCAN(int correnttrack,int track[])本设计默认磁头当前移动方向为自内向外,先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,接下来一并考虑在磁头向外侧移动过程当中输入的作业请求与磁头内侧未被处理的作业磁道请求。此算法对中间磁道请求比较有利。
N_SCAN算法流程图:
N_SCANk=0;min=track[0]i=0idLine[i]是k=k+1;否否i++j=k;i=0;i
1j=k-1;i=10-k;imaxmax=Line[j];k=j否否lLine[i]=Line[k];Line[k]=-1;max=0;Print(lLine);结束
图7 N_SCAN算法模块流程图(2)
四、设计程序
1.主要模块代码:
(1)先来先服务算法void FCFS(int track[])直接根据作业请求磁盘的先后顺序对磁盘进行寻访。先来先服务算法代码: void FCFS(int track[]){ int k;for(k=0;k
printf(“%d->”,track[k]);
} printf(“%d”,track[9]);}
(2)最短寻道时间优先算法void SSTF(int correnttrack,int track[])优先选择距离当前磁头位置最近的作业磁道请求。最短寻道时间优先算法代码: void SSTF(int correnttrack,int track[]){ int Line[10];int i;int j;int d;int min_d;int k;int corrent;
min_d=abs(correnttrack-track[0]);
k=0;corrent=correnttrack;
for(i=0;i
for(j=0;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)电梯算法void SCAN(int correnttrack,int track[])默认磁头当前移动方向为自内向外,先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,再将磁臂换向,访问磁头内侧距离当前磁头位置最近的作业磁道请求。
电梯算法代码:
void SCAN(int correnttrack,int track[]){ int Line[10];int dLine[10];int i;int j;int k;
int min;
k=0;
min=track[0];for(i=0;i
for(j=0;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
if(correnttrack>dLine[i])
{
k=k+1;
} }
j=k;for(i=0;i
Line[i]=dLine[j];
j=j+1;
}
j=k-1;for(i=10-k;i
Line[i]=dLine[j];
j=j-1;
}
Print(Line);}(4)环形扫描算法void C_SCAN(int correnttrack,int track[])先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,再直接将磁头移到最内侧磁道(此过程快速移动,并不访问任何磁道),再由内向外顺次访问距离当前磁头位置最近的作业磁道请求。
环形扫描算法代码:
void C_SCAN(int correnttrack,int track[]){ int Line[10];int dLine[10];int i;int j;int k;int min;k=0;min=track[0];for(i=0;i
for(j=0;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
if(correnttrack>dLine[i])
{
k=k+1;
}
}
j=k;for(i=0;i
Line[i]=dLine[j];
j=j+1;
}
j=0;for(i=10-k;i
Line[i]=dLine[j];
j=j+1;
}
Print(Line);}
(5)N_SCAN算法void N_SCAN(int correnttrack,int track[])默认磁头当前移动方向为自内向外,先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,接下来一并考虑在磁头向外侧移动过程当中输入的作业请求与磁头内侧未被处理的作业磁道请求。
N_SCAN算法
void N_SCAN(int correnttrack,int track[]){ int Line[10];int dLine[10];int lLine[10];int i;int j;int k;
int min,max;int choice;
for(k=0;k
lLine[k]=-1;
}
k=0;min=track[0];for(i=0;i
{ for(j=0;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;idLine[i]){
k=k+1;} } j=k;for(i=0;i“,Line[i]);Line[i]=-1;j=j+1;} j=k-1;for(i=10-k;i
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
for(j=0;j
{
if(Line[j]>max)
{
max=Line[j];
k=j;
}
}
lLine[i]=Line[k];
Line[k]=-1;
max=0;}
for(i=0;i
if(lLine[i]!=-1)
{
printf(”%d->“,lLine[i]);
} } printf(”%d“,lLine[9]);} 2.总模块代码:
void main(){ int track[10];int n;int correnttrack;int choice=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(”nn“);
switch(n)
{
case 1:
printf(”********先来先服务算法(FCFS)*********n磁头移动轨迹为:n“);
FCFS(track);
break;
case 2:
printf(”*****最短寻道时间优先算法(SSTF)******n磁头移动轨迹为:n“);
SSTF(correnttrack,track);
break;
case 3:
printf(”************电梯算法(SCAN)***********n磁头移动轨迹为:n“);
SCAN(correnttrack,track);
break;
case 4:
printf(”*********环形扫描算法(C_SCAN)********n磁头移动轨迹为:n“);
C_SCAN(correnttrack,track);
break;
case 5:
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)最短寻道时间优先算法(Shortest Seek Time First,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算法
先按照从小到大的顺序输出所输入的当前磁头位置外侧的磁道请求,再按照从大到小的顺序输出在磁头向外侧移动过程当中输入的作业请求与所输入的当前磁头位置内侧的磁道请求。
选择该算法后,将输出相应磁头移动轨迹:
图13 N_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算法同时考虑下一个作业磁道请求与当前磁头位置的距离和当前磁头移动方向,但每次磁臂调转方向时,将同时处理在磁头向一侧移动过程当中输入的作业请求,先选择当前磁头之外距离其最近的磁道进行访问,直到再无更外的磁道请求,接下来一并考虑在磁头向外侧移动过程当中输入的作业请求与磁头内侧未被处理的作业磁道请求,此算法对中间磁道请求比较有利。总之,各种算法都有其长处,也各有不足,需要在实际应用中权衡利弊,择优使用。
八、心得体会
本次操作系统课程设计,我不仅完成了课程要求中的任务,更在中期检查后听取了老师的建议,自己上网查找了其他两种磁盘调度算法加入了程序当中,使系统更加完善和完整。在这过程中,我不仅加深了对操作系统的了解,进一步熟悉了C语言编程和Microsoft Visual C++ 6.0的使用,更加了解了很多之前在课本中和课程学习中并不了解和知道的知识,扩展了视野,丰富了体验。
由于自己的知识和能力还不到位,在这两周的时间里也经历了很多困难和挑战,但我认为,在这过程中的每一次的错误和故障,都使我收获颇丰,使我成长了很多。
当然,这个磁盘调度系统的设计远非完美,还有很多地方可以改进,例如界面可以更加友好,资源可以更加节约,算法也还有优化的余地,但是时间有限,本人经历也有限,在课程设计时间允许的范围内只能做到这样,我会在课余时间自行完善该磁盘调度算法程序。
最后,这次课设给我带来了很多的收获,非常感谢在课设过程中老师不厌其烦的讲解指导和身边各位同学的细心帮助。