操作系统课程设计---磁盘调度算法
一.课程设计目的和要求
操作系统是计算机系统的一个重要系统软件。我们在本课程的实验过程中,了解实际操作系统的工作过程,在实践中加深对操作系统原理的理解。
本实验设计的目的是通过设计一个磁盘调度模拟系统,以加深对FCFS、最短寻道时间以及电梯等磁盘调度算法的理解。让我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强动手能力。
课程设计要求
⑴模拟一个磁盘调度算法;
⑵要求能够模拟FCFS、最短寻道时间、电梯算法三个磁盘调度算法;
⑶输入为一组作业的磁道请求;
⑷输出为按选择的算法执行时的磁头移动轨迹。
二.系统需求分析
磁盘调度主要思想:
设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。常用的分配策略有先请求先分配、优先级高者先分配等策略。在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。操作系统中,对磁盘的访问要求来自多方面,常常需要排队。这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。
平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即:L=(M1+M2+……+Mi+……+MN)/N
其中Mi为所需访问的磁道号所需移动的磁道数。
启动磁盘执行输入输出操作时,要把移动臂移动到指定的柱面,再等待指定扇区的旋转到磁头位置下,然后让指定的磁头进行读写,完成信息传送。因此,执行一次输入输出所花的时间有:
寻找时间——磁头在移动臂带动下移动到指定柱面所花的时间。
延迟时间——指定扇区旋转到磁头下所需的时间。
传送时间——由磁头进程读写完成信息传送的时间。
其中传送信息所花的时间,是在硬件设计就固定的。而寻找时间和延迟时间是与信息在磁盘上的位置有关。为了减少移动臂进行移动花费的时间,每个文件的信息不是按盘面上的磁道顺序存放满一个盘面后,再放到下一个盘面上。而是按柱面存放,同一柱面上的各磁道被放满信息后,再放到下一个柱面上。所以各磁盘的编号按柱面顺序(从0号柱面开始),每个柱面按磁道顺序,每个磁道又按扇区顺序进行排序。
磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘是,应采用一种最佳调度算法,以使各种进程对磁盘的平均访问时间最小。由于在访问磁盘的时间中,主要是寻道时间,因此,磁盘调度的目标,是使磁盘的平均寻道时间最少。目前常用的磁盘帝调度算法有:先来先服务、最短寻道时间优先及扫描等算法。
三概要设计
系统流程图
操作系统课程设计---磁盘调度算法
系统模块图
函数调用关系图
操作系统课程设计---磁盘调度算法
四、详细设计(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查找模式有高度局部化的倾向,会推迟一些请求的服务,甚至引起无限拖延(又称饥饿)。
操作系统课程设计---磁盘调度算法
最短寻道时间优先算法流程图
SCAN算法又称电梯调度算法。SCAN算法是磁头前进方向上的最短查找时间优先算法,
它排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。
“电梯调度”算法是从移动臂当前位置开始沿着臂的移动方向去选择离当前移动臂最近的那个柱访问者,如果沿臂的移动方向无请求访问时,就改变臂的移动方向再选择。这好比乘电梯,如果电梯已向上运动到4层时,依次有3位乘客陈、伍、张在等候乘电梯。
操作系统课程设计---磁盘调度算法
他们的要求是:陈在2层等待去10层;伍在5层等待去底层;张在8层等待15层。由于电梯目前运动方向是向上,所以电梯的形成是先把乘客张从8层带到15层,然后电梯换成下行方向,把乘客伍从5层带到底层,电梯最后再调换方向,把乘客陈从2层送到10层。
但是,“电梯调度”算法在实现时,不仅要记住读写磁头的当前位置,还必须记住移动臂的当前前进方向。
电梯算法流程图
五、调试过程
将保存在XXX文件中,运行程序,得到运行结果图如下:
操作系统课程设计
---磁盘调度算法
六、结论与体会
通过这次课程设计,我对磁盘调度算法有了更深的认识,我学会了用C语言编写这个算法,当然这当中我遇到了许多问题,这更使我认识到要将操作系统这门计算机专业的课学好不仅仅是要把书上的基本知识学好而且还要不断进行实践,将所学的跟实践操作结合起来才能更好地巩固所学,提高自己的能力。
七、参考文献
1.《计算机操作系统》汤小丹等西安电子科技大学出版社
2.《操作系统设计教程》张丽芬等清华大学出版社20__年
附件:源程序清单
磁盘调度系统源程序清单
include"stdio.h"
include"stdlib.h"
include"iostream.h"
include
definema_size100
/先来先服务调度算法
voidFCFS(intarray[],intm)
intsum=0,j,i,now;
8操作系统课程设计---磁盘调度算法
for(i=0;i cout< cout<<"请输入当前磁道号:";cin>now; for(i=0,j=1;j {if(i==0)sum=abs(now-array[i]);sum+=abs(array[j]-array[i]); cout<<"移动的总道数:"< /最短寻道时间优先调度算法/voidShortPath(intarray[],intm){ inttemp; intk=1; intnow,l,r; inti,j,sum=0; for(i=0;i for(j=i+1;j if(array[i]>array[j]) temp=array[i]; array[i]=array[j]; array[j]=temp; for(i=0;i cout< cout<<"请输入当前的磁道号:";cin>now; if(array[m-1]<=now) for(i=m-1;i>=0;i--) cout< sum=now-array[0]; else if(array[0]>=now) 操作系统课程设计---磁盘调度算法 for(i=0;i cout< sum=array[m-1]-now; else while(array[k] k++; l=k-1; r=k; /确定当前磁道在已排的序列中的位置,后面的算法都用到了,可以直接复制后再进行少量修改,节省时间。 while((l>=0)(r if((now-array[l])<=(array[r]-now)) cout< sum+=now-array[l]; now=array[l]; l=l-1; else {cout< sum+=array[r]-now; now=array[r]; r=r+1; if(l==-1) for(j=r;j cout< sum+=array[j]-now; now=array[j]; else for(j=1;j>=0;j--) cout< 操作系统课程设计---磁盘调度算法 sum+=abs(array[j]-now); now=array[j]; cout<<"移动的总道数:"< /电梯调度算法 voidElevator(intarray[],intm)/先要给出当前磁道号和移动臂的移动方向/{ inttemp; intk=1; intnow,l,r,d; inti,j,sum=0; for(i=0;i for(j=i+1;j if(array[i]>array[j]) temp=array[i]; array[i]=array[j]; array[j]=temp; for(i=0;i cout< cout<<"请输入当前的磁道号:"; cin>now; if(array[m-1]<=now) for(i=m-1;i>=0;i--) cout< sum=now-array[0]; else if(array[0]>=now) for(i=0;i cout< sum=array[m-1]-now; else 操作系统课程设计---磁盘调度算法 while(array[k] k++; l=k-1; r=k; cout<<"请输入当前移动臂移动的方向(1表示向内,0表示向外):";cin>d; if(d==0) for(j=1;j>=0;j--) cout< for(j=r;j cout< sum=now-2array[0]+array[m-1]; else for(j=r;j cout< for(j=1;j>=0;j--) cout< sum=-now-array[0]+2array[m-1]; cout<<"移动的总道数:"< 主程序 intmain() intc; FILEfp; intcidao[ma_size]; inti=0,count; 12操作系统课程设计---磁盘调度算法 fp=fopen("XXX","r+"); if(fp==NULL) cout<<"文件打不开!"< e_it(0); else while(!feof(fp)) fscanf(fp,"%d",cidao[i]); i++; count=i; for(i=0;i cout< cout< while(1) cout< cout<<"1.先来先服务"<<"2.最短寻道时间优先"<<"cout< cout<<"4.退出"; cout< cout<<"请选择调度算法:"; cin>c; if(c>3) break; switch(c) case1: FCFS(cidao,count); break; case2: ShortPath(cidao,count); break; case3: Elevator(cidao,count); break; getchar(); return0;} 123.电梯调度";