硬盘
硬盘
一、机械硬盘
机械硬盘的逻辑分区从大到小是:磁盘面 -> 柱面 -> 磁道 -> 扇区
,扇区就是机械硬盘逻辑分区的最小单位,一般大小为 512B,也就是 0.5KB,也就是说即使你只想读写几十 B 的数据,磁头也会把对应扇区 512B 的数据都读写。
1.1 快速格式化和低级格式化
平时我们格式化硬盘或者其它储存设备的时候,经常会看到有一个快速格式化的选项,同时还有低级格式化等其它的方式。
这些格式化方式的区别是有没有对储存设备重新分区,比如快速格式化一般就只是清除掉储存设备上的分区表,这样系统认为所有扇区可以重新写入数据;普通格式化往往是填零操作,也就是把所有扇区数据都变成 0,还伴随着检测标注坏道等操作,所以速度会慢上不少;低级格式化现在很少见,却是最彻底的,它会将整个盘面都归空,然后重新划分磁道和扇区分区表等等,经常低级格式化的话对硬盘寿命有一点影响。
每个扇区的容量(Byte,字节)* 一个磁道有多少个柱面 * 整个硬盘一共有多少个磁盘面 = 机械硬盘的总容量。
1.2 磁盘面
从 0 开始编号,因为每个盘面都会有一个磁头,所以这个也是磁头的编号。现在硬盘一般会有几片到十几二十片不等的盘片,也就意味着会有几十个磁盘面。
1.3 柱面
看到上面机械硬盘物理结构的朋友应该清楚,所有磁头都是绑定在一起移动的,所以才会有柱面这个结构。机械硬盘读写数据都是按照柱面来进行的。
1.4 磁道
从磁盘面的最外侧到最内侧从 0 开始编号,大容量的机械硬盘,每个磁盘面都会有几千个磁道。
一些硬盘上有一个比较重要的磁道——最外圈的 0 磁道
。这个磁道不会储存用户数据,我们开机常见的 MBR 引导,就是把引导数据(告诉电脑系统如何启动的数据)和 DPT 硬盘分区数据放到了 0 磁道 0 柱面 1 扇区
(UEFI 引导则是把引导文件放在了 FAT 分区里),文件系统的 FAT 文件分配表有时候也是放到 0 柱面上。0 磁道损坏也是机械硬盘最常见的损坏原因。
1.5 扇区
盘片在高速旋转而磁头固定位置的情况下,磁头在盘面上画出的轨迹是一个圆,我们就把它规定为磁道;而一定时间内磁头在盘片上走过的轨迹是一个圆弧,我们就把它规定为扇区。
逻辑扇区号 = (柱面号*总磁头数+磁头编号) * 每个磁道有多少个扇区 + 扇区编号 - 1
这样子就相当于每个扇区有自己独特的地址,跟我们给酒店房间编号一样,这个地址就是扇区的逻辑区块地址 LBA
。有了编号,磁盘读写数据更方便。
二、固态硬盘
2.1 NAND 闪存
单元体积比较小,所以密度更高,同样成本可以做到更大容量,同时按块方式让擦写读取速度都很快,擦写寿命也比较长;缺点是必须按照块来擦写,也没有真正的随机访问能力,也可靠性相对较低。
NAND 容量大读写都快的特点适合做大容量储存,事实上我们现在的固态硬盘基本都是 3D NAND 闪存
2.2 NOR 闪存
单元体积比较大,容量就很小,擦写速度非常慢,但读取速度很快。可以按字节为单位提供真正的随机访问能力,这意味着它可以就地执行代码(不用把代码搬到运行内存),可靠性也比较高,也因为如此擦写寿命比较短。
NOR 可以就地执行代码和真正随机访问的能力,加上很快的读取速度就非常适合用来装程序文件,比如主板上的 BIOS 通常就是 NOR 闪存。
2.3 主控芯片
主控通过传输数据的通道直接连接着所有的储存颗粒,如果有 DRAM 缓存的话还直接连接着缓存,并维护一份所有储存单元的物理地址表。如果说储存颗粒是一个车站,里面停着很多等待装载乘客的客车,那么主控就是一个调度员,根据所有进入车站旅客的目的地来分配不同的客车,同时记录下每个乘客的出入记录和进去了哪个客车,为了保证一辆车不被挤爆,有时候还需要通过均衡调度来平衡每辆客车的乘客数量等等,总之主控就是个「全局指挥者」,哪里需要哪里搬。
当电脑向固态硬盘发出读取某个数据的指令时,主控就会把目标页地址(上面说过 NAND 最小只能按页读取)通过储存通道发送到对应的固态颗粒上,然后页通过地址线和数据总线把储存单元的值都读出来,读一个就把结果暂存在面上的寄存器中,等读完这个页所有的储存单元,页面寄存器就会把数据通过储存通道返回到主控。
写入擦除数据也是一样,记住 NAND 写入之前必须先擦除对应的块(NAND 擦除最小单位是块),主控会根据地址表找出现在空闲的块,然后发送擦除指令到面,面会把块上所有储存单元的电子全部清空,也就是变成 1,111 等等最低状态。
接着主控会将要写入的页上每个储存单元地址和要写入的数据代表的阈值电压发送到面,面上的寄存器再一个个写入储存单元,如果是 1,111…… 这样就不用写,如果是 0,001…… 就根据不同的电压来写。
主控还负责另外一个很重要的功能,那就是均衡负载,延长 NAND 固态颗粒的寿命。在上面我们学到每次擦除时电子都会对储存单元的氧化层造成物理损伤,如果每次写入数据都逮着一个固态颗粒上的同一个块薅羊毛,那么很快这个块就死翘翘了。
所以主控通常还会记录每个块的擦除次数,把数据平均分配到不同的块中,让每个块儿的擦写次数都比较均匀,最大限度延长颗粒的寿命。当某个块的确挂掉的时候,主控还负责在地址表上把这个块屏蔽掉,不然再往这个块写入的数据就保存不了了。
2.4 DRAM 缓存
有些固态硬盘上还有一个和储存颗粒一样颜色,但是小一点的颗粒,这个一般就是固态硬盘的 DRAM 缓存。
DRAM 缓存原理和结构决定它比储存颗粒要快很多很多,所以写入数据时先将数据写入缓存,然后空闲时再写入储存颗粒,这样就让用户实际感受到的写入速度快很多。通常厂商都是按照 1GB:1MB 以上的比例来配置 DRAM 缓存,用户写大文件的时候缓存不够用就会暴露颗粒真实速度了。
2.5 固态硬盘的颗粒
虽然固态硬盘使用的接口协议总线决定了读写速度的上限,但固态硬盘实际能跑多快,还是要看颗粒的质量还有主控算法。
SLC
Single Level Cell,指的是通过一个阈值电压区分 0, 1 两种状态的储存单元,这样一个储存单元就能储存 1bit 的数据。
MLC
Multi Level Cell,指的是通过三阈值电压区分 00, 10, 01, 11 四种状态的储存单元,这样一个储存单元就能储存 2bit 的数据。
TLC
Triple Level Cell,指的是通过七个阈值电压区分 000, 001, 010, 011, 100, 101, 110, 111 八种状态的储存单元,这样一个储存单元就能储存 3bit 的数据。
QLC
Quadruple Level Cell,指的是通过十五个阈值电压区分 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 十六个状态的储存单元,这样一个储存单元就能储存 4bit 的数据。
PLC
快出来了,一个储存单元就能储存 5bit 的数据。
同样面积的储存单元,QLC 比起 SLC 能够存放 4 倍的数据,也就是说闪存颗粒的密度提升了 4 倍,这已经是很惊人的差距了,同一块闪存颗粒如果全做 QLC 可以有 1000GB 容量,那么 TLC 只有 750G, MLC 只有 500G,SLC 更是只有 256G 了。 而且由于数据密度提高,相同容量的 TLC 固态价格也和数据密度一样是 SLC 的 1/4 左右,也就是说便宜同时还变大碗。这听起来好像很美好,那么为什么大家都那么抵制使用 TLC /QLC 储存单元的固态硬盘呢?
2.6 多层储存单元的缺陷
首先就是一个储存单元上,分的阈值电压越多读取的时候就要越多次,比如 TLC 读取一次一页的数据就要轮流给 7 个阈值电压,每给一次阈值电压都要一个个检测储存单元是否导通,而 SLC 只要一个阈值电压检测一次,每多一个需要检测的阈值电压,读取速度就会慢很多倍
。
多个阈值电压也会带来读取困难后果,即使只做到 TLC 的级别也会带来阈值电压区间过小的问题,因为我们往储存单元写入数据的时候,并不能精确控制电子量,如果阈值电压过小电子量又刚好卡在中间,那么数据到底是 010 还是隔壁的 011呢?这个时候就需要 ECC 纠错算法的加入,通过校验数据纠正这个储存单元上的信息然后重新写入正确的数据,这一步又大大减慢了读取速度。
写入的时候也是这样,阈值电压越多,储存单元储存数据需要的电子量要求就越精准,自然就越容易出错。出错的时候又要 ECC 纠错算法来校验重新写入正确数据,写入速度也被拉慢了
。
阈值电压变的设置对储存单元的寿命也有影响,先不说上面提到反复写入影响到的寿命,我们知道每一次写入都会对包括浮栅的绝缘层造成物理损伤,而闪存颗粒又是每一次写入数据都需要先擦除对应块再写入数据
,这样时间长了浮栅里面保存的电子就会越来越容易穿过漏洞逐渐增多的绝缘层「越狱」跑掉。
从 MLC 到 QLC,容量密度越来越高,价格越来越便宜的同时,以上提到的缺点也会越来越严重
。简单总结就是,在对比之下 SLC 读写速度最快,数据保存最稳定可靠,寿命最长
,对比之下我们才知道 SLC 除了数据密度低和贵,真的是哪哪都好。这也不怪大众批评厂商用 TLC/MLC 是「偷工减料」了。
现在厂商都会使用 DRAM 或者将固态硬盘的一部分空间模拟成 SLC 来加当做缓存来解决 TLC/QLC 的速度问题,而且即使是 QLC,只要容量足够大并且有一个好的主控,那么我们日常使用每个储存单元的擦写数据可以控制得很低,只要你不是每天 24 小时不停在写入,基本上也有十几年的寿命。所以最后还是要看个人的需求,如果的确对数据可靠性和速度有很高要求,并且价格不敏感,那的确不要考虑 QLC 甚至是 TLC,感觉大部分时候都可以。
2.7 TRIM
如果系统(比如 WIN10)检测到固态硬盘支持这个指令,那么删除数据的时候根本不会发出删除指令,只会建立那个部分的磁盘快照(在空白块建立快照的速度比擦除那一块再写入要快得多),然后把这个快照交给主控,主控就会在空闲时按照这个快照去慢慢擦除对应的块,等擦除完成再通知系统,这样下次系统需要写个数据的时候就可以直接写入对应的块了。
三、其他
3.1 文件系统
因为我们很少有只占用一个扇区以下的文件,所以文件系统会将磁盘面上相邻的若干个扇区合并为一个簇(又叫分配单元,Unix 类系统叫块,反正都是一个意思)。文件系统进行读写操作的基本单位就是簇
。
每个系统规定的簇大小都不一样,
簇越大读写速度就越好,但是空间浪费越严重
,比如 64K 簇大小的文件系统,存放 1KB 的文件也要在磁盘上占用 64KB 的扇区 Windows NTFS 文件系统的簇大小是 4KB。
3.2 机械硬盘和固态硬盘不同接口对应的总线协议
接口 | 协议 | 总线 |
---|---|---|
SATA | SATA、AHCI | SATA |
mSATA | SATA、AHCI | SATA |
SATAe(Express) | SATA | PCIe |
M.2(NGFF) | SATA、NVMe | PCIe |
PCIe | NVMe | PCIe |
AIC | NVMe | PCIe |
SAS | SCSI | SAS、SATA |
U.2 | SCSI、SATA、NVME | PCIe、SATA、SAS |