最近学习linux内核源码,读到操作系统boot引导相关内容时,对于磁盘相关原理介绍引起我的兴趣。阅读相关资料后,对磁盘工作原理做一个总结,参考资料为深入理解计算机系统(CSAPP)。
磁盘是广泛应用的数据存储设备,存储容量比较大,相比RAM等存储设备价格低,读写速度慢,从磁盘读信息的时间是毫秒级,是DRAM的十万倍,SRAM的一百万倍,后面会对磁盘读取数据耗时计算进行详细的介绍。
磁盘由多个盘片(platter)构成,每个盘片都有两面。盘片表面覆盖着磁性材料用于记录信息,盘片中央有一个旋转主轴控制盘片以固定的旋转速率(rotational rate)旋转,旋转速度是磁盘性能的一个参数,通常为5400~15000转每分。
磁盘的每个盘面是由一组称之为磁道(track)同心圆构成,每个磁道又被划分为多个扇区(sector)。每一个扇区中包含相等的数据位(通常为512字节),数据编码在磁盘的磁性材料中。扇区之间有一些间隙(gap)分隔开,间隙中不存储数据位,间隙存储用来标识扇区的格式化位。
另外还可以用柱面(cylinder)来描述多个盘片驱动器的构造,柱面指的是所有盘片表面上到主轴中心距离相等的磁道集合。比如磁盘有3个盘片,6个面,每个面上距离中心距离相等的磁道称之为一个柱面,如下图所示:
磁盘容量是大家购买以及使用磁盘时考虑的一个点。磁盘容量单位有K,M,G,T。这里要主要磁盘的计量单位与内存(RAM)的计量单位尽管单位表示字母一样,但实际大小不一样。在对RAM进行计量时1K=1024bytes,1M=1024K,1G=1024M。对于磁盘来说,1K=1000,1M=1000K,1G=1000M。
衡量磁盘容量主要有以下几个因素决定:
假如某个磁盘有5个盘片,每个扇区512字节,每个面20000条磁道,每条磁道平均300个扇区,磁盘容量计算如下:
磁盘容量=512字节x300扇区x20000磁道x2表面x5盘片=30 720 000 000字节=30.72G
磁盘通过读/写头来读写存储在磁性表面的位,读写头连接着一个传动臂的一端,通过沿着半径前后移动这个传动臂,驱动器就能将读/写头定位在任意一个扇区上。机械臂这种运动称为“寻道(seek)”
,当寻道完成后,通过磁盘的转动就可以将读写头定位在我们想要的扇区,此时读写头可以感知到这个位的值,也可以修改这个位的值。
从上面的描述可以知道对磁盘数据一次读写可以分为三步:1、寻道 2、旋转磁盘 3、数据传送。寻到过程是通过转动传动臂来径向的定位磁道,旋转磁盘目的是定位初始扇区,数据传送是对磁盘数据进行读/写操作。因此磁盘读写耗时为上述三个过程耗时之和。
例如有一个磁盘参数如下:旋转速率15000RPM(r/min),Ts=8ms,每条磁道的平均扇区数500。计算得到Tr=1/2x(1/15000)x60x1000=2ms。Ttran=(1/15000)x(1/500)x60x1000=0.008ms
Ttotal=Ts+Tr+Ttran=10.008ms。
现代磁盘构造复杂,由多个盘面。盘面上有多个不同的记录区,为了对操作系统隐藏这些复杂性,现代磁盘将它们的构造呈现成一个简单的视图,将多个扇区定义为一个逻辑块,并对块进行编号。磁盘封装的时候有一个小的硬件设备称为磁盘控制器,维护着逻辑块号与实际的物理磁盘扇区之间的映射关系。
当操作系统想要执行一个I/O操作时,例如读取一个磁盘扇区的数据内存到主存时操作系统发送一个指令给磁盘控制器,让磁盘控制器读取某个逻辑块号。控制器上的硬件执行一个快速表查找,将一个逻辑号翻译成一个(盘面,磁道,扇区)的三元组,这个三元组唯一的标识了一个物理扇区,控制器上的硬件会解释这个三元组,将读/写头移动到适合的柱面,等待扇区移动到读/写头下,将读/写头感知的位数放到控制器的一个小缓冲区中,然后将它们复制到主存中。
磁盘控制器必须对磁盘进行格式化,然后才能在磁盘上存储数据。格式化包括用标识扇区的信息填写扇区的间隙,标识出的表面有故障的柱面并且不适用它们,并且在每个区中预留出一组柱面作为备用,如果区中个一个或者多个柱面在使用过程中坏掉,则可以使用这些备用柱面。由于存在备用柱面,所以磁盘格式化后的容量比最大容量要小。