操作系统实验五:磁盘管理实验


实验  磁盘管理实验

一、实验目的

1、 了解磁盘调度的策略和原理

2、 理解和掌握磁盘调度算法——先来先服务算法(FCFS、最短寻道时间优先算法(SSTF)、电梯扫描算法(SCAN

二、实验内容

1、 模拟先来先服务法(First-Come, First-Served,FCFS),最短寻道时间优先法(Shortest Seek Time First, SSTF),电梯扫描算法(SCAN三种磁盘调度算法;

2、 对三种算法进行对比分析。

3、 输入为一组请求访问磁道序列,输出为每种调度算法的磁头移动轨迹和移动的总磁道数。   

三、实验原理

1、先来先服务算法(FCFS):  按先来后到次序服务,未作优化。最简单的移臂调度算法是“先来先服务”调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。 采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。

2、最短寻道时间优先算法(SSTF) :  最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。但最短查找时间优先(SSTF)调度,FCFS会引起读写头在盘面上的大范围移动,SSTF查找距离磁头最短(也就是查找时间最短)的请求作为下一次服务的对象。SSTF查找模式有高度局部化的倾向,会推迟一些请求的服务,甚至引起无限拖延(又称饥饿)。

3、扫描算法(SCAN):  SCAN 算法又称电梯调度算法。SCAN算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法在 很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。“电梯调度”算法是从移动臂当前位置开始沿着臂的移动方向去选择离当前移动臂最近的那个柱访问者,如果沿臂的移动方向无请求访问时,就改变臂的移动方向再选择。但是,“电梯调度”算法在实现时,不仅要记住读写磁头的当前位置,还必须记住移动臂的当前前进方向。

四、实验中用到的系统调用函数(包括实验原理中介绍的和自己采用的),自己采用的系统调用函数要按照指导书中的格式说明进行介绍。

  模拟程序没有用到系统调用函数

五、实验步骤

算法所用到的数据结构与变量:

1、vector<int>Distance:记录每一次移动的磁道数。这里我没有用普通的int变量累加的方式计算总的磁道数,而是记下每次移动的磁道数。因为我想记下在移动过程中每一步骤的移动步伐,可以查询从哪里移动到哪一步时的移动的距离。而不是单纯为了得到一个最终结果。

2、vector<int>request:请求磁道序列

3、int DiskCount:请求磁道的个数

4、int *SSTF_TempDiskSSTF算法用到的记录当前磁道与每个请求磁道的距离

5、int *SCAN_TempDiskSCAN算法用到的记录当前磁道与每个请求磁道的距离

6、int SSTF_countSSTF算法用到的记录移动次数

7、int SCAN_countSCAN算法用到的记录移动次数

8、int SCAN_dirSCAN算法用到的扫描方向1代表由里向外,-1代表由外向里。

算法思路:

1、FCFS算法:

按顺序读出请求磁道,依次移动,并计算移动的磁道数且记下。对移动的磁道数进行累加,便可以获得总的磁道移动数。

2、SSTF算法:

以递归的方式,每次寻找与当前磁道距离最近的请求磁道,并以此作为当前磁道递归调用SSTF函数继续执行。

3、SCAN算法:

先规定初始扫描方法为由里向外,即由小到大。基于递归的方式,先计算当前磁道与请求磁道的距离,找出距离最小且磁道数大于当前磁道数的磁道,如果找到,则以此磁道为当前磁道,继续递归,如找无,则证明该方向上已无请求磁道,转变方向,在另一方向上找到与当前磁道距离最近的磁道,以此为当前磁道继续递归。

算法优化:

SCAN算法的目的是实现在一个方向上顺序移动磁道,遇到有请求的进行,直至该方向上没有请求磁道。在这里我们可以换种想法,抛弃上面的思路。由于实验为静态的请求序列,我们可以提前将请求磁道序列进行排序,再找到初始位置,以该位置为起点向一个方向输出,直至尽头后再转换方向往另一边输出至尽头。磁头的移动轨迹与上述算法相同,但时间复杂度大大降低。

主程序流程图:

六、实验结果分析(截屏的实验结果,与实验结果对应的实验分析)

  实验要求磁道个数范围在[0,1000]之间,在实现输出方面由于随机产生的磁道个数越大时磁道轨迹也就越长,一页图片放不下,也不容易观察,故在此重复执行实验时选取个数较少的实验结果进行展示,在最后也展示了一次个数较多的情况。

  在下图可以发现,FCFS算法按照先来先服务规则移动磁头。其磁头移动轨迹按照磁道请求序列的顺序移动,

  观察SSTF磁头移动轨迹,可以发现磁头下一次移动的磁道总是距离当前磁道最近的,在请求数多的情况下其磁头移动轨迹看起来很像扫描法一直向另一端移动一样,但实际上并不是,只是临近的磁道数多,比较紧凑,随着磁头的移动,所在磁道数会离初始磁道数越来越远,秉着寻道时间优先的前提,也就越来越向一端极化,从而表现得与扫描法相近。但这是由于磁道请求序列固定不变,当磁道请求序列为动态时SSTF会呈现高度局部化的倾向,而SCAN算法不一定。

  观察SCAN算法的磁头移动轨迹,可以明显发现,他从初始位置一直往外扫描,并扫描至尽头后转变方向向反方向扫描。

 

  

  

  通过多次实验研究可以发现,FCFS的移动的总磁道数远远高于其他两种算法,SSTF的移动总磁道数略高于SCAN算法。实验结果符合理论预期,FCFS基于先来先服务原则,经常可能出现磁头在整个磁盘大幅度移动,导致每次磁道请求移动的磁道数大,进而导致整个请求完成时造成巨量的移动次数。SSTF基于寻道时间短的原则,他改善了磁盘服务,在此处静态请求序列的情况下表现良好,但如处于操作系统的动态申请当中,就非常容易陷入高度局部化,导致另一端的请求长时间得不到服务。SCAN算法基于电梯原则,表现最佳,避免了SSTF中高度局部化的缺点,在磁道来回扫描,遇到所需的磁道时就进行服务,磁头仅移到每个方向上有服务请求的最远的道上。

磁道个数较多的输出情况:

 

 

 

七、思考题

1、通过对每个算法进行时间复杂度分析对比,每个算法的效率如何?

  FCFS算法直接从请求序列读出数据,有多少个请求磁道就执行多少次,故时间复杂度为O(n)

  SSTF算法采用递归算法,一共递归N次,每次递归下的最大执行次数为N,故时间复杂度为O(n²)

  SCAN算法初始版本采用递归算法,一共递归N次,每次递归下同样最大执行次数为N,故时间复杂度为O(n²)。快排版本时间复杂度由快排函数决定,时间复杂度为O(nlogn)

  FCFS算法的效率最高,但解决实际寻道问题的能力不足。SCAN算法的效率较好,在实现算法时我总是会花大量时间和资源在整个请求序列里去寻找下一次磁道移动的位置,实际上在真正的寻道过程中完全不需要手动去寻找下一次要移动到的磁道位置,只要磁头往一个方向移动,遇到请求磁道就接受,只要感应到移动方向上还有待执行的请求序列即可。在静态请求序列中,SSTF算法和SCAN算法的表现大致相同,但在实际磁盘寻道中是远远不一样的,不能因为实验结果中磁头移动的轨迹大致相同就认为两种算法差不多,SSTF算法效率最低,且容易陷入高度局部化中。

2、若所有硬盘全部设计成电子硬盘,哪个磁盘调度算法最合适?

  电子硬盘不存在物理磁头寻道操作,没办法使用磁头,故使用FCFS先来先服务算法。

、实验数据及源代码(学生必须提交自己设计的程序源代码,并有注释,源代码电子版也一并提交),包括思考题的程序。

  程序完整代码请转至个人GitHub仓库(如果喜欢,麻烦点个star✨谢谢~)

结语:随笔仅供参考,千万不要照抄哦,我相信你可以的~!


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM