数据存储架构与技术
上QQ阅读APP看书,第一时间看更新

2.1.3 磁盘固件

磁盘的电子部件有主控 SoC芯片,用于信号处理、检错纠错、驱动电机等;在控制器上也运行了相应的固件,用于地址映射、请求排队与调度、缓存等功能。下面将介绍磁盘固件中的地址映射、磁盘缓存和磁盘调度几方面的内容。

1.地址映射

磁盘向操作系统导出了一个线性的一维地址空间,通常称为 LBA(Logical Block Address,逻辑块地址)。磁盘的固件需要将操作系统所看到的一维线性地址转换为磁盘内部的扇区地址。在磁盘内部,通常采用 CHS 描述磁盘扇区的 PBA (Physical Block Address,物理块地址)。CHS代表柱面(Cylinder)、磁头(Head)和扇区(Sector),通过这3个维度的参数可以定位到内部的特定扇区。磁盘固件中的地址映射功能完成从 LBA到 PBA的映射。

从 LBA映射到 CHS的一种简单的映射关系可以表示为

其中,Cylinder#、Head#和Sector#分别为柱面编号、磁头编号和扇区编号。Cylinder_Sectors 和 Track_Sectors 分别表示每个柱面中的扇区个数和每个磁道内的扇区个数。

在实际的磁盘中,地址映射关系相对复杂。为了支持优化存储密度、提高访问性能等,地址映射中还包括分区(Zone)、重映射(Remap)、偏移(Skew)等常见的技术。

(1)分区

在磁盘中,不同磁道的周长是不同的。有两种方式在磁道中划分扇区,一种方式是固定扇区数,另一种方式是固定位密度,即每个扇区采用固定的长度。上述简单的映射关系是假设每个磁道固定扇区数,但是这浪费了周长较长的磁道(即外圈磁道)的存储密度。如果采用每个磁道固定扇区数,那么 CHS的计算会比较麻烦。因而,在磁盘中采用分区的方式是两者之间的折中方式。

分区将盘面上不同半径的磁道划分为多个区域,每个区域中按照每磁道固定扇区数的方式划分扇区,不同区域之间每磁道的扇区数不同,尽可能获得较高的位密度。通过这种方式,在存储密度和地址映射便利性之间取得平衡。

在带有分区的情形下,CBA 到 CHS 的转换仅需要记录几个分区的起始地址即可。其计算方式为

其中,Zone_LBA为当前分区中LBA的偏移,Zone_StartLBA和Zone_Start Cylinder分别为当前分区的起始 LBA和起始柱面号。

(2)重映射

在磁盘中,地址映射需要处理扇区故障。如果一个扇区出现故障,磁盘需要重映射故障扇区到新的扇区,以进行数据读写。在磁盘中,通常在每个磁道上预留一个或多个扇区,用于扇区的重映射。

在有扇区重映射的情形下,磁盘固件需要记录一个重映射表。重映射表中记录了故障扇区的地址到新扇区的地址。在 CHS地址转换时,通过查找重映射表以确定扇区是否发生了重映射,并获得发生重映射的扇区的新地址。

(3)偏移

在磁道进行切换时,在磁头移动的过程中,盘片依然在旋转。所以,当磁头在不同磁道之间进行切换时,磁头开始读取时已经不是下一个相邻扇区了。为了解决这个问题,可以采用偏移的做法。如图2.7所示,依据磁道切换的时间,在下一个磁道编号时,向后偏移一定数量的扇区数。磁道切换需要时间,同样在盘面切换、柱面切换中也会有类似的问题。因而,偏移同样可以在盘面或柱面切换时使用。

在有偏移的情形下,逻辑地址到物理地址的转换中需要计算出相应的偏移位置,从而合并到已有计算结果中。

图2.7 带偏移的地址块映射示意

2.磁盘缓存

磁盘在设备内部会保留一定大小的嵌入式内存,用于数据的缓存,典型的磁盘缓存大小为2~64 MB(注意,操作系统中也将主存中对磁盘的缓存称为磁盘缓存,与本小节的磁盘缓存是不同的概念)。磁盘缓存跟大部分缓存的作用类似,既包括了写数据的缓冲,也包括了读数据的缓存。

(1)写缓冲

主机将数据发给磁盘,磁盘可以将数据先缓冲在磁盘缓存中,然后给主机返回完成的通知。磁盘在后台将数据再写入磁盘介质。通过这样的方式,主机看到的磁盘写性能有明显的提升。这样的缺点是,因为磁盘缓存是易失的,数据在系统掉电时可能会丢失。为防止数据丢失,主机可以关闭磁盘缓存,或者启用显式调用 sync等同步操作。

(2)读缓存与预取

主机与磁盘之间的接口性能通常大于磁盘内部介质的访问性能。因而,磁盘缓存的另一个作用是提供读缓存。磁盘可以通过预取操作,将磁盘介质上的数据先行读取到磁盘缓存中。在主机发送读请求到磁盘时,数据读缓存可以提高数据在磁盘缓存中命中的概率,从而降低读延迟。

3.磁盘调度

磁盘接收到磁盘读写请求的地址是分散的,磁盘的调度算法通过调度读写请求的顺序,减少请求的平均访问时间,提高磁盘整体吞吐率,并增强不同请求之间的公平性。

(1)FCFS算法

FCFS(First Come First Service,先来先服务)算法不改变读写请求的顺序,按照请求到达的顺序依次进行服务。先来先服务算法的优势是公平性很强,请求的延迟相对较低,但缺点是磁盘的整体吞吐率不高。

(2)SSTF算法

SSTF(Shortest Seek Time First,最短寻道时间优先)算法是选择读写请求中离当前磁道最近的请求进行服务。该算法的优势在于能够降低磁盘寻道的时间,提高磁盘的整体吞吐率,但缺点是公平性难以保证,会出现饿死现象,即出现请求一直得不到响应的情形。

(3)扫描(SCAN)算法

扫描算法,也被称为电梯算法,是从磁盘盘面上的一端一直移动到另一端,在移动的过程中处理相应的读写请求;然后再跳回到起始的一端,按同样的方向移动,服务请求。扫描算法的优点在于磁盘整体吞吐率较高,也不会出现饿死现象。

循环扫描(C-SCAN)算法与扫描算法类似,不同之处在于循环扫描在磁头从一端移动到另一端后,并不跳回到起始的一端,而是从所在位置反向移动到起始的一端,在移动的过程中进行读写请求的服务。

(4)前看(LOOK)算法

前看算法与扫描算法类似,区别在于前看算法从一端移动到另一端时仅移动到所有请求中最大磁道号即可停止,而不是一直移动到盘面的最末端。这样的方式相比于扫描算法,可以减少不必要的磁头移动。

循环前看(C-LOOK)算法是前看算法的变种,与循环扫描算法类似,从一端往另一端移动时,并不是跳回到起始的一端,而是服务完一个方向后反向移动,并在移动过程中服务请求。

目前,硬盘的技术仍然在发展之中,如何提高磁盘的密度是关注点。例如,SMR(Shingled Magnetic Recording,叠瓦式磁记录)、HAMR(Heat-Assisted Magnetic Recording,热辅助磁记录)、MAMR(Microwave-Assisted Magnetic Recording,微波辅助磁记录)等新技术。