磁盘一次读或写操作总的存取时间=寻道时间+延迟时间+传输时间,但是由于延迟时间和传输时间都与硬盘的转速有关,转速越大,时间越短,因此系统需要优化的是寻道时间,以下所讲的磁盘调度算法都是服务于寻道时间

1. 一次磁盘读/写操作需要的时间

  1. 寻道时间

    在读写前,将磁头移动到指定磁道所花的时间。
    其实启动磁头臂也是需要时间的,这里把它记为 s.
    移动磁头时,每跨越一个磁道耗时m,总共假设跨越n个磁道。
    所以寻道时间 T=mn+s;

  2. 延迟时间

    通过旋转磁盘,是磁头到达目标扇区所需要的时间。转速设为r.
    所以平均所需的延迟时间 Tr=(1/2)*(1/r)=1/2r

  3. 传输时间

    从磁盘读出或向磁盘写入数据所经历的时间,假设磁盘转速是r,读写字节为b,每个磁道上的字节数是N,则:
    Tt=(1/r)*(b/N)=b/(rN)

2.1. 先来先服务算法

根据进程请求访问磁盘的先后顺序进行调度

假设磁头的初始位置是 100 号磁道,有多个进程先后陆续的请求访问 55, 58, 39, 18, 90, 160, 150, 38, 184

磁头总共移动了 45 + 3 + 19 + 21 + 72 + 70 + 10 + 112 + 46 = 498 个隧道

2.2. 最短寻道时间优先(SSTF)

优先调度与当前磁头所在磁道最近的磁道。

假设磁头的初始位置是 100 号磁道,有多个进程先后陆续的请求访问 55, 58, 39, 18, 90, 160, 150, 38, 184

磁头总共移动了 (100 - 18) + (184-18) = 248 个隧道

响应一个请求平均需要移动 248 / 9 = 27.5 个磁道

虽然平均寻道时间变短了,但是不够公平。如果新到达的磁道请求总是比在等待的磁道请求近,那么等待的那个请求就会饥饿。两端的磁道请求更容易出现饥饿现象。

2.3. 电梯算法(SCAN)

电梯总是保持一个方向运行,直到该方向没有请求位置,然后改变运行方向。
电梯算法和电梯的运行过程类似,总是按照一个方向进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。
因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了 SSTF 算法的饥饿问题。

假设某磁盘的隧道为 0 ~ 200 号,磁头的初始位置是 100 号隧道,且此时磁头正在往磁道号增大的方向移动,多个进程陆续的请求访问 18, 38, 39, 55, 58, 90, 150, 160, 184

磁头总共移动了 (200 - 100) + (200-18) = 282 个隧道

响应一个请求平均需要移动 282 / 9 = 31.3 个磁道

2.4. 循环扫描算法(C-SCAN)

SCAN 算法对于各个位置磁道的响应频率不平均,而 C-SCAN 算法就是为了解决这个问题。**规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求**。

优点:比起 SCAN 来,对于各个位置磁道的响应频率很平均。
缺点:只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再往右移动磁头了;并且,磁头返回时其实只需要返回到18号磁道即可,不需要返回到最边缘的磁道。另外,比起SCAN算法来,平均寻道时间更长。

2.5. LOOK 算法

LOOK 如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。(边移动边察, 因此叫 LOOK )

优点:比起 SCAN 算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短

2.6. C-LOOK 算法

C-SCAN 算法的主要缺点是只有到达最边上的磁道时才能改变磁头移动方向,并且磁头返回时不一定需要返回到最边缘的磁道上。C-LOOK 算法就是为了解决这个问题。如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。比起 C-SCAN 算法来,C-LOOK 不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短。

3. 减少磁盘延迟时间

延迟时间指的是是磁头寻找目标删去所花的时间(磁头在扇区所属的磁道,通过磁盘转动寻找到目标扇区)

3.1. 交替编号

做法:让编号相邻的扇区在物理上不相邻。
原理上:读取完一个扇区后,需要一段时间处理才可以继续读入下一个扇区。

3.2. 错位命名

具体做法:让相邻盘面的扇区编号“错位”
原理:与交替编号相同。“错位命名法可以降低延迟时间”

磁盘地址结构(柱面号,盘面号,扇区号),为什么不是(盘面号,柱面号,扇区号)?
因为在读取地址连续的磁盘块时,前者更不需要移动磁头。

4. 总结