Lecture 6. 磁盘操作与磁盘调度(21 页)
- 硬盘驱动器的物理特性
- 数据组织和性能
- 磁盘调度算法
机械硬盘的结构
机械硬盘普遍采用 SATA(串行 ATA)接口,初版 SATA 到 SATA3.2 逐渐变快。
对于机械硬盘来说,盘片(platter) 越小,意味着重量约轻,噪音越少,旋转起来所需要的功率越小,越省电,同时寻道(seek)性能会越好,通常寻道需要 4~9ms。但是,盘片小了,那么用来记录数据的面积也小了,需要增加密度来弥补这个缺陷。
信令接口(signalling interface) 越快,传输速度也会越快。
盘片
如果硬盘只有一个盘片,那么就会有总共两面。其中只有一面能用来存储数据,另一面空着用来保存 定位信息(positioning info)。而如果硬盘有两个盘片,那就有三面可以用来存数据。
盘片是圆形的,上面有数千条同心圆 磁道(track)。每个磁道都被分成了好多块 扇区(sector),扇区是最小的可以寻址、读取、写入的存储单元。老旧设备的扇区通常是 512 字节,现在新设备大多数 4096 字节。
扇区的数量实在是太多了,所以有些操作系统(比如 Windows),会把相邻的几个扇区当作一个 簇(cluster)。簇是文件可以占用的空间的最小单位。这样做可以让资源利用更高效。
每个盘片表面都有一个 磁头(head),也叫读写头。这个磁头可以在盘片表面线性移动到对应的磁道,然后等待目标扇区转动到磁头下方位置。
扇区
每个扇区都包含 ID、状态码 status code、同步位模式(synchronization bit pattern)(用来引导磁头),然后 512 或 4096 字节的数据,再接着纠错码(ECC),最后还会有跟下一个扇区之间的 gap。
如果使用更大的扇区,那么可以节省乱七八糟的各种信息的数量,但是文件占用的最小空间也增加了。
区位记录 Zoned bit recording
由于磁道是同心圆,所以如果外侧和内侧的密度是一致的,那么外侧的扇区数量就是比内侧更多的。
于是,磁道可能会根据离心距离被分成若干组。内侧(红色)扇区数量最少,外侧(灰色)扇区数量最多。
于是,如果盘片旋转的位置恒定,那么外层磁道传输数据的速度就会比内层快。而磁道、扇区的编号是从外侧到内侧递增的,所以这样的结构对于比较新的、空的硬盘来说,会有更好的性能。
固态硬盘 Solid State Drive
固态硬盘是非易失的存储,是 electrical 的(不是 mechanical 的)。相比机械硬盘,SSD 更省电(不需要寻道),性能更好(因为不需要磁头到处乱跑),但容量相对少,价格更贵。
磁盘调度
磁盘调度,是针对机械硬盘而非固态硬盘的。
机械硬盘性能的瓶颈,主要受限于磁头的物理移动。这个时间称为 寻址时间(seek time)。
在多任务系统当中,可能将要使用多个扇区。如何规划磁头移动的顺序,降低平均寻址时间(磁头移动的总距离),非常重要。
原生指令排序(Native Command Queuing),是应用在 SATA 当中的一个扩展技术,能允许硬盘驱动器在内部优化不同 IO 命令的执行顺序。
之前提到过,磁头移动是线性(垂直)的,不是水平的。它只能移动到对应的磁道上,等待扇区转动过来。之前还提到过,磁道编号、扇区编号都是从外向里递增的。
假设外层磁道编号是 0,最内层磁道编号是 199。当前磁头位于 53 号磁道。那么对于磁道序列 ${98, 183, 37, 122, 14, 124, 65, 67}$,不同的调度算法表现如何?
FCFS 调度
先到先服务。跟进程调度的 FCFS 类似,虽然公平,但是性能不咋滴。看示意图,很明显,磁头里里外外跑来跑去的,不好。
SSTF 调度
是最短寻道时间优先的(shortest seek time first)意思,类似于进程调度里面的 SJF 算法。算是对于 FCFS 的一种改进。
注意,SSTF 并不是平均寻道时间最快的算法。比如,序列 ${53, 37, 14, 65, 67, 98, 122, 124, 183}$ 比 SSTF 序列更快。
缺点跟 SJF 一样,可能会出现饥饿现象,即外侧或内侧的磁道由于距离太远,总是被中间的插队。
SCAN 和 C-SCAN 调度
扫描算法。当前方向走到头,然后掉头,再走到头,再掉头,如此往复。
缺点是,当走到头之后刚刚掉头回来的时候,由于刚才扫过一遍了,这里可能很空;但是另一头由于比较久没有被扫描,任务很多。于是,SCAN 算法有了一个改进——C-SCAN 调度算法
C-SCAN 是循环扫描(circular)的意思。也就是说,走到头之后,不掉头,直接刷的一下移动到最开始的地方,重新按照之前的方向扫一遍。也就是,头是接着尾端的。
LOOK 和 C-LOOK 调度
LOOK 和 C-LOOK 是对于 SCAN 和 C-SCAN 的一种改进。走到头是没有必要的,LOOK 是走到最远的有任务的位置。下面是 C-LOOK 的示意图。