《操作系统课设--磁盘调度算法.docx》由会员分享,可在线阅读,更多相关《操作系统课设--磁盘调度算法.docx(30页珍藏版)》请在第壹文秘上搜索。
1、计算操作系统课程设计报告姓名:崔玲玲班级:软件111学号:201101014103指导老师:夏辉丽1 .操作系统课程设计任务描述21 .1先来先效劳算法(FCFS)22 .2最短寻道时间优先算法(SSTF)2L3扫描算法(SCAN)21.4循环扫描算法(CSCAN)22 .问题定义与需求分析32. 1输入的形式33. 2输入值的范围34. 3输出的形式35. 4程序所能到达的功能36. 5测试数据33 .概要设计及流程图41 .1子模块的调用关系43 .2个别函数的参数43. 3主要的流程图44 .问题实现及代码64. 1先来先效劳算法的实现65. 2最短寻道时间优先算法的实现66. 3扫描算
2、法的实现87. 4循环扫描算法的实现85 .调试分析96 .测试101 .1测试数据106 .2测试界面Il7 .课设总结138 .参考文献139 .源代码141.操作系统课程设计任务描述本课程设计的目的是通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易使人理解,使磁盘调度的特点更简单明了,这里主要实现磁盘调度的四种算法,分别是先来先效劳算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法。1.l先来先效劳算法(FCFS)这是一种比拟简单的磁盘调度算法,它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某
3、一进程的请求长期得不到满足的情况。1.2最短寻道时间优先算法(SSTF)该算法要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,该算法可以得到比拟好的吞吐量,但却不能保证平均寻道时间最短,对用户的效劳请求的响应时机不是均等的。1.3扫描算法(SCAN)扫描算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。例如,当磁头正在自里向外移动时,等请求到磁道的外部边缘时,磁道调换方向,开始从最小号磁道依次向最大号磁道效劳。这样很好的防止了饥饿现象的出现。吞吐量较大,平均响应时间较小。其缺点是对用户的效劳请求的响应时机不是均等的,因而导致响应时间的变化幅度很大
4、。1.4循环扫描算法(CSCAN)循环扫描算法是对扫描算法的改良,不同于循环扫描的是循环扫描算法规定磁头单向移动,也就是当磁头到达磁盘的边缘时,磁头那么直接返回到磁盘的另一边缘,继续做原来请求方向进行效劳。此算法解决了扫描算法的缺点,也同时具有最短寻道时间优先算法的优点即吞吐量较大,平均响应时间较小不过,磁道两端的访问频率仍低于磁道中间的访问频率。2.问题定义与需求分析2.1 输入的形式磁道号数组的输入:定义一个数组,intCidaO口,先提示用户输入磁道号串的个数n,然后依次输入n个磁道号(磁道号中间可用空格或回车键隔开),输入完毕后回车键结束输入,运行下一步。2.2 输入值的范围数据的大小
5、:全局变量maxsiZe=100O,磁道数组CidaOmaxsize的大小就是IOo0,输入时有大小提示,大于最大值时那么也只能保存前IOoO个数据。关于intnow,表示的是当前的磁道号,程序运行时会让用户在每种算法中都输入当前的磁道号now,如果输入了除数字以外的字符,那么提示错误,让用户重新输入。2. 3输出的形式用户输入磁道数组后,程序会显示用户输入的数组,按用户的输入顺序输出,输出形式是一横行,如果是排序之后的,那么输出排序后的磁道号。3. 4程序所能到达的功能程序的main函数实现了程序的运行模式,运行后首先会显示磁盘调度算法系统的系统名称,紧接着下面就是系统菜单,在系统菜单里,可
6、以供用户选择6个选项:L输入磁道号2.先来先效劳3.最短寻道时间优先4.扫描调度5.循环扫描6.退出系统,由用户输入磁道号串后,可以连续选择不同的调度算法,不过每种调度算法都会提示用户重新输入当前的磁道号而不用再输入磁道号串,操作起来比拟方便;在扫描和循环扫描算法中,还会让用户选择磁道的请求方向,向内还是向外;选择系统退出时,系统会提示是否真的退出(yesno),如果手动输入大写的YES或是小写的yes系统都会退出,如果输入的是其他字符系统那么调用main(),继续磁盘调度的算法操作。4. 5测试数据由于定义的磁道数组和当前磁道号的数据类型都是整形数,所以用cin.fail。函数检验错误,如果
7、有数据类型错误的错误,再用cin.clear。进行错误去除,接着再用一个Cin.ignore。函数忽略掉输入的错误数据,最后用goto返回,继续进行数组数据的输入,这样可以有效的防止用户手误输错的情况。3.概要设计及流程图3.1 子模块的调用关系本程序主要分为八大模块,除了系统菜单里的六个选择项之外,还有排序函数PaiXU(),主函数mian().在主函数里,有用户选择输入,算法以及退出,用SWitCh函数控制,去调用外部的函数FCFS(),SSTF(),SCAN(),CSCAN(),shuru()和Exit()分别进行算法实现。其中用到排序的算法SSTF(),SCANO和CSCAN()都在函
8、数里调用了PaiXU()进行排序。3.2 个别函数的参数四个算法函数和ShUrU()函数都用参数,像FCFS(intcidao口,intm),CidaO口是磁道数组,函数实现的时候函数里的参数可以不同于intcidao,结果都是对的,因为其根本都是对主函数里的intCidaOIjTlaXSize进行操作的;intm是指磁道号的个数,输入函数ShUrU()完成给m以及磁道号串的赋值,因为输入函数规定了磁道的大小和各个磁道号。5. 3主要的流程图主函数主要是实现功能的选择,流程图如图1所示。先来先效劳函数的流程很简单,用户输入磁道号串后,选择菜单功能2即调用先来先效劳磁盘调度算法,用户再输入当前磁
9、道号,系统会显示磁盘寻求序列也就是磁道的输入顺序,然后依次给予效劳,最后在求和,输出平均值,本设计报告省略了此算法的流程图。最短寻道时间优先算法的实现不同于先来先效劳算法,它需要调用排序函数来给磁道号排序,然后在效劳,流程图如图2所示。扫描算法的实现流程图如图3所示:循环扫描算法是基于扫描算法实现的,与之不同的是循环扫描算法当原来的磁头访问到磁到边缘后,磁头直接跳到磁盘的另一边缘,然后按原来的寻求方向继续给磁道效劳,此处省略了流程图。函数调用功能实现图2最短寻道时间优先算法流程图图3扫描算法流程图4.问题实现及代码4.1 先来先效劳算法的实现voidFCFS(intcidao,intm),输入
10、磁道号,按先来先效劳的策略输出磁盘请求序列,求平均寻道长度,输出移动平均磁道数。主要代码:fbr(i=O,j=l;jm;i+,j+)(sum+=abs(arrayIj-arrayi);ave=(float)(sum)(float)(m);)6. 2最短寻道时间优先算法的实现voidSSTF(intcidao,intm),将磁道号用冒泡法从小到大排序,输出排好序的磁道序列,输入当前磁道号,根据前磁道在已排的序列中的位置,分三种情况进行访问总长度计算,第三种是比拟找到离now最近的磁道号坐标,按找到的磁道号方向访问,然后反过来访问其他未访问的,算出寻道总长度,输出移动的平均磁道长度。主要代码:(1
11、)当前磁道号大于请求序列中最大者时,直接从大到小依次给予各请求效劳if(cidaom-1=now)(COUt=O;i-)coutcidaoi=now)COUtVV”磁盘扫描序列为:”;for(i=0;im;i+)coutcidaoin,;sum=cidaom-1-now;)(3)当前磁道号大于请求序列中最小者且小于最大者时while(cidaoknow)先确定当前磁道在已排的序列中的位置k+;/k为离now最近的磁道坐标)l=k-l;/1为now左边的磁道坐标r=k;r为now右边的磁道坐标if(now-cidaol)=(cidaor-now)选择与当前磁道最近的请求给予效劳(coutcida
12、old;if(d=0)选择移动臂向磁道号减小的方向扫描(COUt=0;j-)(coutcidaojn,;输出向外扫描的磁道序列)fbr(j=r;jm;j+)/磁头移动到最小号,那么改变方向向内扫描未扫描的磁道coutcidaoj=0;j-)coutcidaofjr;j-)(coutcidaofj=0;j-)(coutcidaojll;j-)(coutcidaoj,;)sum=now-cidao0+cidaofm-l-cidao0+cidaom-l-cidaor;)5 .调试分析运行过程中,发现第一种先来先效劳算法,当输入的磁道号只有一个的时候,计算的平均值出错,是随机数,经过缜密的考虑才发现,这种情况应该作为特殊情况来考虑,所以,我在总长度计算的代码中增加了一种特殊情况。代码如下:if(m=l)/m是磁道号的个数ave=(float)(sum)(float)m;COUtVV”平均寻道长度:,aveen