操作系统课程设计报告磁盘调度算法Word格式.docx
《操作系统课程设计报告磁盘调度算法Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告磁盘调度算法Word格式.docx(23页珍藏版)》请在冰豆网上搜索。
1、模拟一个磁盘调度算法;
2、要求能够模拟最短寻道时间优先(SSTF)、N步扫描算法(NStepSCAN)算法两个磁盘调度算法
3、输入为一组作业的磁道请求,改组磁道好的获得从文件中取出;
4、输出为按选择的算法执行时的磁头移动轨迹。
参考文献
1任满杰等.《操作系统原理实用教程》.电子工业出版社,2006
2张尧学,史美林.《计算机操作系统教程》实验指导.清华大学出版社,2000
3罗宇.《操作系统课程设计》.机械工业出版社,2005
4汤子瀛,哲凤屏,汤小丹编著.《计算机操作系统》.西安电子科技大学出版社,2005
5周敏,杨武,杨承玉编著.《计算机操作系统原理实验指导》基于LINUX(Ver3.0).重庆:
重庆工学院,2006
6谭浩强编著..C语言程序设计(第3版).清华大学出版社,2005
审查意见
指导教师签字:
教研室主任签字:
年月日
说明:
本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
一.课程设计需求分析
操作系统是计算机系统的一个重要系统软件。
我们在本课程的实验过程中,了解实际操作系统的工作过程,在实践中加深对操作系统原理的理解。
磁盘存储器不仅容量大,存取速度快,而且可以实现随机存取,是当前存放大量程序和数据的理想设备,故在现代计算机系统中,都配置了磁盘存储器,并以它为主来存放文件。
这样,对文件的操作,都将涉及到对磁盘的访问。
磁盘I/O速度的高低和磁盘系统的可靠性都将直接影响到系统性能。
因此,设法改善磁盘系统的性能,已成为现代操作系统的重要任务之一。
磁盘性能有数据的组织、磁盘的类型和访问时间等。
磁盘调度的目标是使磁盘的平均寻道时间最少。
也正因为这样,我们有必要对各算法进行模拟,进而比较、分析、了解。
本实验设计的目的是通过设计一个磁盘调度模拟系统,以加深对最短寻道时间优先(SSTF)、N步扫描算法(NStepSCAN)等磁盘调度算法的理解。
让我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强动手能力。
二.课程设计原理
设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。
常用的分配策略有先请求先分配、优先级高者先分配等策略。
在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。
操作系统中,对磁盘的访问要求来自多方面,常常需要排队。
这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。
访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。
因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。
平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即:
L=(M1+M2+……+Mi+……+MN)/N。
其中Mi为所需访问的磁道号所需移动的磁道数。
启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送。
因此,执行一次输入输出所花的时间有:
寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间;
延迟时间——指定扇区旋转到磁头下所需的时间;
传送时间——由磁头进程读写完成信息传送的时间。
其中传送信息所花的时间,是在硬件设计就固定的。
而寻找时间和延迟时间是与信息在磁盘上的位置有关。
为了减少移动臂进行移动花费的时间,每个文件的信息不是按盘面上的磁道顺序存放满一个盘面后,再放到下一个盘面上。
而是按柱面存放,同一柱面上的各磁道被放满信息后,再放到下一个柱面上。
所以各磁盘的编号按柱面顺序(从0号柱面开始),每个柱面按磁道顺序,每个磁道又按扇区顺序进行排序。
磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘是,应采用一种最佳调度算法,以使各种进程对磁盘的平均访问时间最小。
由于在访问磁盘的时间中,主要是寻道时间,因此,磁盘调度的目标,是使磁盘的平均寻道时间最少。
三.算法分析及程序概要设计
1.最短寻道时间优先算法(SSTF)
1.1算法分析:
最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。
也就是说,该算法选择这样的进程:
其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。
但这种算法不能保证平均寻道时间最短。
现在利用一个例子来讨论,假设当前移动臂所在的磁道为100,进程请求访问磁盘的先后次序为:
55、58、39、18、90、160、150、38、184。
那么该算法将这样进行进程调度:
现在当100号柱面的操作结束后,应该先处理90号柱面的请求,然后到达58号柱面执行操作,随后处理55号柱面请求,后继操作的次序应该是39、38、18、150、160、184。
采用最短寻找时间优先算法决定等待访问者执行操作的次序时,读写磁头总共移动了200多个柱面的距离,与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。
SSTF算法虽然能获得较好的寻道性能,但却可能导致某个进程发生“饥饿”(Starvation)现象。
因为只要不断有新进程的请求到达,且其所要访问的磁道与磁头当前所在磁道的距离较近,这种新进程的I/O请求必然优先满足。
也就是说,SSTF查找模式有高度局部化的倾向,会推迟一些请求的服务,甚至引起无限拖延(饥饿)。
1.2概要设计(流程图):
2、NStepSCAN算法
2.1算法分析
N步扫描算法是基于扫描算法发展而成的,故要想很好的了解它,首先得对扫描算法加以理解分析,只有这样才能很好地理解N步扫描算法。
扫描算法(SCAN)又称电梯调度算法。
该算法不仅考虑到与访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。
SCAN算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法这种逐步自里向外又自外向里(或先自外向里又自外向里)的磁头移动规率,很好地避免了出现“饥饿”现象,并在很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。
“电梯调度”算法是从移动臂当前位置开始沿着臂的移动方向去选择离当前移动臂最近的那个柱访问者,如果沿臂的移动方向无请求访问时,就改变臂的移动方向再选择。
这好比乘电梯,如果电梯已向上运动到4层时,依次有3位乘客陈生、伍生、张生在等候乘电梯。
他们的要求是:
陈生在2层等待去10层;
伍生在5层等待去底层;
张生在8层等待15层。
由于电梯目前运动方向是向上,所以电梯的形成是先把乘客张生从8层带到15层,然后电梯换成下行方向,把乘客伍生从5层带到底层,电梯最后再调换方向,把乘客陈生从2层送到10层。
但是,“电梯调度”算法在实现时,不仅要记住读写磁头的当前位置,还必须记住移动臂的当前前进方向。
N步扫描算法是将磁盘请求队列分成若干个长度为N的子队列,磁盘调度将按FCFS算法依次处理这些子队列。
而没处理一个队列时又是按SCAN算法,对一个队列处理完后,在处理其他队列。
当正在处理某子队列时,如果又出现新的I/O请求,便将新请求进程放入其他队列,这样就可以避免出现粘着现象,统称“磁盘粘着”(Armstickiness)(有一个或几个进程对某一磁道有较高的访问频率,即这些进程反复请求对某一磁道的I/O操作,从而垄断了整个磁盘设备的现象)。
而在SSTF、SCAN及CSCAN几种调度算法中,都有可能出现磁臂留在某处不动的情况,即出现磁盘粘着现象。
当N取值很大时,会使N步扫描的性能接近于SCAN算法的性能;
当N=1时,N步扫描算法退化为FCFS算法。
此外,需要了解的是N步SCAN算法的简化算法是FSCAN算法,即将磁盘请求队列分成两个子队列的算法。
2.2概要设计(流程图)
从文件中获取进程请求磁道号放入cidao[i]统计总个数count
输入当前磁道号now,子队列个数N,移动臂的移动方向d
从cidao[i]中取出前count/N组成一个子队列,存入b[i],最后一列将该子队列为剩余磁道号,存入b[i]
YN
四、详细设计
#include"
stdio.h"
stdlib.h"
//#include"
iostream.h"
#definemaxsize100//定义最大数组域
intnow,s;
//最短寻道时间优先调度算法
voidSSTF(intarray[],intm)
{
inttemp;
intk=1;
intnow,l,r;
//当前磁道号now;
找出的当前磁道左侧的磁道l,右侧的磁道r
inti,j,sum=0;
intavg;
for(i=0;
i<
m;
i++)
{
for(j=i+1;
j<
j++)//对磁道号进行从小到大排列
{
if(array[i]>
array[j])//两磁道号之间比较
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
for(i=0;
i++)//输出排序后的磁道号数组
printf("
%d"
array[i]);
printf("
\n请输入当前的磁道号:
"
);
scanf("
%d"
&
now);
\nSSTF调度结果:
"
if(array[m-1]<
=now)//判断整个数组里的数是否都小于当前磁道号
{
for(i=m-1;
i>
=0;
i--)//将数组磁道号从大到小输出
sum=now-array[0];
//计算移动距离
elseif(array[0]>
=now)//判断整个数组里的数是否都大于当前磁道号
for(i=0;
i++)//将磁道号从小到大输出
sum=array[m-1]-now;
else
while(array[k]<
now)//逐一比较以确定K值
k++;
l=k-1;
r=k;
//确定当前磁道在已排的序列中的位置
while((l>
=0)&
&
(r<
m))
if((now-array[l])<
=(array[r]-now))//判断最短距离
{
printf("
array[l]);
sum+=now-array[l];
now=array[l];
l=l-1;
else
array[r]);
sum+=array[r]-now;
now=array[r];
r=r+1;
if(l==-1)
{
for(j=r;
j++)
array[j]);
sum+=array[m-1]-array[0];
else
for(j=l;
j>
j--)
avg=sum/m;
\n移动的总道数:
%d\n"
sum);
平均寻道长度:
avg);
}
//扫描调度方法
voidSCAN(intarray[],intm,intd)//先要给出当前磁道号和移动臂的移动方向
intl,r;
//用于排序的临时参数
intq;
array[j])//对磁道号进行从小到大排列
\nSCAN调度结果:
i--)
printf("
//将数组磁道号从大到小输出
q=array[i];
sum=now-q;
s=s+sum;
now=q;
//将磁道号从小到大输出
s=s+sum;
if(d==0)
q=array[j];
sum=now-2*array[0]+array[m-1];
now=q;
}//磁道号减小方向
sum=-now-array[0]+2*array[m-1];
}//磁道号增加方向
\n该子队列移动的总道数:
该子队列平均寻道长度:
voidNStepSCAN(intarray[],intm)
{
intsn,N,d;
//sn标记每一子队列的长度,N记录子队列个数,now标记当前磁道号
intb[100],c[100];
//b[100]储存前几个子队列,c[100]储存最后一个子队列
inti=0,j=0,k=0,n=1;
intave;
请输入当前磁道号:
\n"
请输入子队列的个数:
N);
while(N<
1||N>
m)
超出范围,文件中的磁道数不够分组,请重新输入:
请输入当前移动臂的移动的方向(1磁道号增加方向,0磁道号减小方向):
d);
sn=m/N;
while(N!
=1)//当不是最后一个子队列时,循环进行SCAN调度
j=0;
for(i=k;
sn*n;
i=k,j++)
b[j]=array[i];
k=k+1;
\n第%d个队列的排序结果为:
n);
SCAN(b,sn,d);
N=N-1;
n=n+1;
if(N==1)//最后一个子队列时进行SCAN调度
for(i=k,j=0;
i++,j++)
c[j]=array[i];
\n最后一个队列的调度结果为:
SCAN(c,m-k,d);
ave=s/m;
\n该调度总的结果为:
s);
ave);
//操作界面
intmain()
intc;
intC=1;
FILE*fp;
//定义指针文件
intcidao[maxsize];
//定义磁道号数组
inti=0,count;
fp=fopen("
cidao.txt"
"
r+"
//读取cidao.txt文件
if(fp==NULL)//判断文件是否存在
\n请先设置磁道!
\n"
exit(0);
while(!
feof(fp))//如果磁道文件存在
fscanf(fp,"
cidao[i]);
//调入磁道号
i++;
count=i;
\n--------------------------------------------------\n"
10-11年度OS课程设计--磁盘调度算法模拟"
\n磁道读取结果:
count;
%5d"
cidao[i]);
//输出读取的磁道的磁道号
\n"
while(C==1)
╭═══════════════╮\n"
║操作系统课程设计║\n"
╭═════┤磁盘调度算法├═════╮\n"
║║║║\n"
║╰═══════════════╯║\n"
║║\n"
║1.最短寻道时间优先算法(SSTF)║\n"
║2.N步扫描算法(NStepScan)║\n"
║╭───────────────────────╮║\n"
╰═┤请输入你的选择的算法(输入0离开)├═╯\n"
╰───────────────────────╯\n"
c);
if(c==0)exit(0);
while(c!
=1&
c!
=2)
输入数据超出范围,请重新输入您想进行的调度算法:
switch(c)
case1:
SSTF(cidao,count);
//最短寻道时间优先算法
break;
case2:
i=0;
{
printf("
exit(0);
}
NStepSCAN(cidao,count);
//N步扫描算法
是否继续(按0结束,按1继续)?
scanf("
C);
return(0);
五、调试运行结果
1.调试运行后的开始界面如下:
2、调试运行各个算法结果如下:
2.1运行最短寻道时间优先(SSTF)算法调度程序结果如下:
2.2调试运行NStepSCAN调度程序结果如下:
2.2.1移动臂的移动方向