问:机械硬盘是如何工作的?
答:请看VCR
一、机械硬盘物理结构
1.1、盘片(platter)
- 视频中银白色的圆盘称为盘片,二进制数据就是存储在盘片上,盘片解剖后如下图所示:
- 一圈一圈的同心圆称为磁道(track),一个盘片有很多磁道,一般磁道数量能达到 500,000 个甚至更多;
- 将磁道沿直径方向进行分割得到扇区(Sector),扇区是盘片上的最小分割单位,即扇区是磁盘进行读写的最小单位(扇区是磁盘上最小的可寻址单元),一般为 512 Byte( 也有2KB的,最新的硬盘可以达到4KB);
- 图示中每一个磁道扇区数量都一样,一个扇区大小均固定为 512Byte,而外侧磁道相比内侧磁道空间相对较大,所以存储同样大小的数据,内侧扇区比较拥挤,外侧扇区宽敞,即数据存储密度是不一样的,外侧扇区会浪费大量的存储空间。
- 随着技术的进步,现如今硬盘通过ZBR(Zoned Bit Recording,区位记录)技术,使得外侧磁道扇区数大于内侧磁道扇区数,以便保证不同磁道的扇区的数据密度基本一致;
- 对于绝大部分文件系统来说,任何一个文件都是占用整数个扇区的,即一个扇区只会属于一个文件, 如果没用满,后面的就空着,就是我们说的数据对齐。
- 盘片有 2 面,均可以存储数据,每一面称为盘面;
- 盘面大小:磁道数 * 每道扇区数 * 每扇区字节数;如图示为 8KB(2 * 8 * 512 = 213 Byte);
- 一个盘片容量: 盘面大小 * 2;如图所示为16KB;
- 数据密度一致的硬盘计算逻辑稍微复杂。
1.2、磁头臂
数据读取和写入要依靠磁头臂,磁头臂在不同磁道上移动(由内而外或者由外而内)即可读写数据。一个磁头臂只能读写一个盘面,所以一个盘片需要两个磁头臂,如下图所示。
1.3、柱面
- 将多个盘片像糖葫芦一样串起来,通过主轴统一控制所有盘片旋转,这样可以读写同一磁道不同扇区的数据;
- 同时,磁头臂也串起来通过组合臂统一控制移动,即所有磁头只能 “共进退”,这样我们可以读写更大容量的二进制数据。
- 组合后,发现多个盘片上半径相同的磁道可以一起读写,这些磁道组成的面称为柱面;
- 柱面是连续数据分配的单位,即写完一个柱面,才会换下一个柱面。
比如Window中,C盘用柱面
0~10
,D盘用柱面11~20
。
二、读写硬盘
2.1、扇区物理地址
通过前面介绍,我们知道了柱面、盘面、扇区这些概念,我们依次给它们一个编号,得到了柱面号、盘面号、扇区号,这样我们就大致确定硬盘上不同位置数据的地址了。
2.2、物理地址存放
扇区内部示意图如下所示:
- 地址区:存放当前扇区地址,即前面的物理地址三元组(柱面号、盘面号、扇区号),读/写磁头会使用;
- 数据区:存放真正的数据,扇区大小指的正是数据区的大小;
- 前导/同步区:记录这个旋转磁盘的确切速度和每个比特位的长度;
不同磁道的扇区数据密度不一致,所以不同磁道的扇区内,1个bit占用的长度也不一样,通过转速和bit长度来控制读写时间。
- 纠错码(ECC, error correction/correcting code):区用于校验数据区数据。
2.3、读写磁盘数据
根据上述提到的地址三元组:柱面号、盘面号、扇区号,我们调整磁头臂和旋转主轴来读写指定扇区的数据,即:
① 根据柱面号
移动磁头臂,让磁头臂指向指定柱面;
② 根据盘面号
激活指定盘面对应的磁头;
③ 根据扇区号
旋转主轴找到要读写的扇区;磁盘旋转的过程中,指定的扇区会从磁头(分为读磁头和写磁头)下面划过,这样就完成了对指定扇区的读写。
2.4、影响硬盘性能的因素
通过前面分析,发现读写一个扇区的数据会有额外时间的花费,即:
- 寻道时间(seek time)
将读写磁头移动至正确的柱面(磁道)上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms。 - 旋转延迟(rotational latency time)
主轴旋转将请求数据所在的扇区移动到读写磁头下方所需要的时间。旋转延迟取决于磁盘转速,通常为磁盘旋转一周所需时间的一半。15000 rpm(RPM,Revolution(s) Per Minute),即每分钟转15000圈:
转一圈的时间:60 * 1000 / 15000 = 4 (毫秒/圈),
旋转延迟:4 / 2 = 2ms;
2.5、 顺序读写 Vs 随机读写
要想节省磁盘读写时间,就要尽量避免寻道和旋转延迟,即:
- 要读写的扇区刚好是此时磁头臂指向的磁道(柱面);
- 要读写的扇区刚好位于磁头臂下;
这就是顺序读写,即机械硬盘的顺序读写性能很好(磁头一般是先读写完柱面后才开始寻道的),随机读写性能较差,因为随机读写时,磁头需要不停的移动,还有旋转延迟,所以性能不高。
2.6、顺序读写优化案例
- 许多的开源框架如Kafka、HBase中,都通过追加写的方式来尽可能的将随机读写转换为顺序读写,以此来降低寻址时间和旋转延时。
- 数据库中WAL(Write Ahead Log)预写日志,比如MySql InnoDB中的redolog 就是通过磁盘顺序写保证事务持久化的。
最后,留个思考题:
你知道磁盘碎片为啥会降低磁盘读写性能,进而影响操作系统及软件性能吗?
三、硬盘存储微观世界
3.1、bit表示
机械硬盘上每一个 bit 都是由一个磁场微块组成的, 微块内原子的南北极是随机的,磁化后(写入数据)微块所有原子的南北极都指向同一方向,如下图所示:
3.2、写入数据
写磁头会产生一个强磁场,改变它正下方的磁盘微块极性,磁化之后的微块变成永磁体,能保持这个状态很多年,即数据的持久化。
3.3、读出数据
读磁头检测的是相邻两个微块的磁极变化, 这是因为磁极变化的强度比单个微块的磁场强度要大得多,所以这种方式的检测准确率非常高。
- 相邻微块磁场方向变化,表示 1;
- 相邻微块磁场方向不变,表示 0。
如果较长连续区域的磁极都一样,对应的就是一长串的 0,由于读磁头的精度,有可能会导致多读或少读几个 0,导致数据错乱。
解决:利用每个扇区的前导区和纠错码区中的信息进行修正处理。
四、总结
- 了解了机械硬盘读写数据的基本逻辑;
- 知道了硬盘读写的最小单位是扇区(一般为 512 Byte);
- 明白了顺序读写优于随机读写的原理和具体实践应用;
- 懂得了硬盘存储 bit 的具体细节。