OS 磁盘调度算法 之 FCFS、SSTF、SCAN、CSCAN

了解磁盘构造

先初步了解下磁盘的构造以及相关名词等。
补充资料:博客园:磁盘基本知识(磁头、磁道、扇区、柱面)
01

磁盘调度

  • 寻道时间:把磁臂(磁头)移动到指定磁道上所经历的时间。
  • 旋转延迟时间:指定扇区移动到磁头下面所经历的时间。
  • 传输时间:指把数据从磁盘读出或向磁盘写入数据所经历的时间。

磁盘调度算法

  • 磁盘调度算法有若干种,但着眼点都放在寻道优化上,即寻道时间尽量短,吞吐量尽量大。
  • 目前广泛使用的寻道策略有下列几种:

一、先来先服务算法(first-come first-service,FCFS)

磁头按照进程请求访问磁道先后依次进行移动。
按照顺序来移动。

  • 算法思想:按进程请求访问磁盘的先后次序进行调度。
  • 优点:简单,公平。
  • 缺点:效率不高,相邻两次请求可能会造成最内到最外的柱面寻道,使磁头反复移动,增加了服务时间,对机械也不利。- 特点:合理、简单、但未对寻道进行优化。

二、最短寻道时间优先算法(Shortest-Seek-Time-First,SSFT)

磁头选择与当前所在磁道位置距离最近的磁道请求作为下一次服务的对象。
选择最近的磁道来移动。

  • 算法思想:优先选择距当前磁头最近的访问请求进行服务,主要考虑寻道优先。
  • 优点:改善了磁盘平均服务时间。
  • 缺点
    (1)不能保证平均寻道时间最短;
    (2)可能会使某些请求总得不到服务(又称饥饿)。

三、扫描算法(又称电梯算法,SCAN)

在磁头移动方向上选择与当前磁头所在的磁道距离最近的请求作为下一次服务的对象。
像电梯一样在向上移动的时候一直移动到要访问的最高层,然后反过来移动到要访问最低层。
比如移动方式:内→外→内→外,一直来回往返移动。

  • 算法思想:当设备无访问请求时,磁头不动;当有访问请求时,磁头按一个方向移动,在移动过程中对遇到的访问请求进行服务,然后判断该方向上是否还有访问请求,如果有则继续扫描;否则改变移动方向,并为经过的访问请求服务,如此反复。
  • 优点
    (1)具有较好的寻道性能;
    (2)避免了饥饿现象
  • 缺点:不利于远离磁头一端的访问请求。

四、循环扫描算法(CSCAN)

磁头按照规定的移动方向一直移动到另一端,然后迅速回到原始位置,以此循环。
比如移动方式:内→外、内→外,一直以单一方向移动。

  • 该算法是对扫描算法(SCAN)的改良,它规定磁头单向移动,例如自内向外移动,当磁头移动到最外磁道时立即又返回到最内磁道,如此循环进行扫描。
  • 优点:消除了对两端磁道请求的不公平。

总体比较

优点 缺点
FCFS算法 公平、简单 平均寻道距离大,仅应用在磁盘I/O较少的场合
SSTF算法 性能比“先来先服务”好 不能保证平均寻道时间最短,可能出现“饥饿”现象
SCAN算法 寻道性能较好,可避免“饥饿”现象 不利于远离磁头一端的访问请求
C-SCAN算法 消除了对两端磁道请求的不公平

例题

这里为了分辨理解调度算法,上述四种方法在下面例题中都会使用。

假定一个磁盘有200个柱面,编号为0~199,在完成了对125柱面的请求后,当前正在143号柱面处为一个请求服务。请求队列中还有若干个请求者在等待服务,假设它们依次要访问的柱面号为: 86,147, 91,177,94,150,102,175,130。 请分别计算采用先来先服务调度算法、最短寻找时间优先调度算法和扫描调度算法时实际服务的次序和磁臂移动的距离。并说明哪种算法更合适些,为什么?

解:

① FCFS(先来先服务)算法:

  • 直接按照文题中依次要访问的柱面号来进行磁头移动
  • 143 → 86 → 147 → 91 → 177 → 94 → 150 → 102 → 175 → 130

磁头从143号柱面开始移动

访问的下一磁面号 移动磁面数
86 57
147 61
91 56
177 86
94 83
150 56
102 48
175 73
130 45

平均寻面长度 = (57+61+56+86+83+56+48+73+45) / 9 = 565/9 = 62.78

② SSTF(最短寻道时间优先)算法:

以143为出发点,寻找离143号最近的磁面即147;然后以147位出发点,寻找最近的磁面即150;后面以此类推即可。
143 → 147 → 150 → 130 → 102 → 94 → 91 → 86 → 175 → 177

从143号柱面开始

访问的下一磁面号 移动磁面数
147 4
150 3
130 20
102 28
94 8
91 3
86 5
175 89
177 2

平均寻面长度 = (4+3+20+28+8+3+5+89+2) / 9 = 162/9 = 18

③ SCAN(扫描)算法:

  • 从文题(在完成了对125柱面的请求后,当前正在143号柱面处为一个请求服务)中可以知道磁头的移动方向是由125→143即由小到大,由外而内(磁道0号在最外面)
  • 以143为出发点,然后向磁面号比它大的最近磁面号移动即移动到147;然后以147为出发点向磁面号比它大的最近磁面号移动即移动到150;
  • 当达到需要访问的最大磁面号177时,移动方向 由小到大 改为 由大到小(由外而内 改为 由内而外)。然后以177为出发点向磁面号比它小的最近磁面号移动即移动到130,然后依次类推。
  • 有点类似生活中的公交车一样,一直往一个方向开车,中途有人访问时就停车访问,然后继续开车直至该方向上的最后一个乘客,然后把方向掉头继续开(并不是非要开到终点站才转头,详情请看题后的 注释 )。
  • 143 → 147 → 150 → 175 → 177 → 130 → 102 → 94 → 91 → 86

从143号柱面开始

访问的下一磁面号 移动磁面数
147 4
150 3
175 25
177 2
130 47
102 28
94 8
91 3
86 5

平均寻面长度 = (4+3+25+2+47+28+8+3+5) / 9 = 125/9 = 13.89

④ CSCAN(循环扫描)算法:

  • 和上述的SCAN算法有些相似,区别就是到达终点站的时候并不是改变移动方向然后继续移动,而是磁头会立即回到初始位置然后以之前相同的方向继续移动。
  • 147 → 150 → 175 → 177 → 86 → 91 → 94 → 102 → 130

从143号柱面开始

访问的下一磁面号 移动磁面数
147 4
150 3
175 25
177 2
86 91
91 5
94 3
102 8
130 28

平均寻面长度 = (4+3+25+2+91+5+3+8+28) / 9 = 169/9 = 18.78

答:其中SCAN算法的平均寻面长度最小,所以选择SCAN算法比较好。

注释:

  • 在这里面,SCAN 和 CSCAN 算法还有一些小疑问或争议,就是磁头是否要从0号的一端完整的移动到另外一端?

  • 首先去百度了一下,然后看到了下面的解释:

02

  • ①百度百科上面横线处是规定SCAN和CSCAN算法中,磁头要一直移动到末端然后才掉头继续移动(SCAN)或重新回到起点继续移动(CSAN)。
  • ②而波浪线处的实际情况却更加符合我们做题的情况——移动到该方向上最后一个需要访问的地方就开始掉头(SCAN)或从改方向上第一个需要访问的磁道号(CSCAN)。

这里给出的解释是:我们在做题过程中,文题中没有特别说明的话就按照上述第②种情况进行解题,并不需要移动至末端。

例如上述例题中的CSCAN算法:
磁头到了177号磁面后就没有继续向该方向(磁面号由小到大)移动了,同时而是到达了86号,177→86。而不是立即回到0号磁面处再去86号磁面:177→0→86。

战争中军队移动支援战场理解例子:

  • 磁头 —— 主力部队:规模极大,移动速度慢。用于支援每一处战场。
  • 磁盘 —— 战争发生场所:在一条长河畔边,岸上有许多的小规模战争需要军队的支援。
  • 调度算法 —— 侦查队伍:规模极小,速度快;用于通知主力部队的下一个支援地点;根据调度算法不同侦查部队的侦查顺序也不同。

主力部队在177号战场支援后,派出侦查部队去探寻需要支援的位置。侦查部队向该方向继续移动直至末端确保没有需要支援的战场,然后迅速回到0号初始位置继续移动,到达86号确定需要支援后通知主力部队,随后主力部队直接移动到86号位置进行支援。后面以此类推。
侦查部队:177→末端→0→86
主力部队:177→86
03

资料参考

猜你喜欢

转载自blog.csdn.net/qq_43068326/article/details/105314046