本文已参与「新人创作礼」活动,一起开启掘金创作之路。
固态硬盘
SLC、MLC、TLC和QLC
固态硬盘为了实现存储功能,可以简单的认为是用了一个电容加一个电压。给电容充电的时候就代表1,给电容放点的时候就代表0。用这种实现存储功能的方式,叫使用了SLC颗粒。
所谓MLC、TLC、QLC,就是在电容里可以存下2个,3个,4个比特。如何能够实现?就是在充电时,通过充上不同的电压,让电压表区分来实现的。
组成结构
和其他I/O设备一样,它也有对应的接口和控制电路。接口可以采用SATA或者PCI Express接口。而控制电路里,有个重要的模块,叫FLT(Flash- Translation Layer,内存转换层)。
接下来是它实际的I/O设备。它的裸片和机械硬盘的盘面存放方式一样,是多个裸片平行叠加在一起的。
一个裸片上有多个平面(它的存储容量在GB级别),而一个平面上又会有多个块(它的存储容量在几百KB到几MB),一个块又会被分成多个页(通常是4KB)。
SSD读取和写入的基本单位,是一个块。它的写入操作不像机械硬盘通过覆写来进行,而是要擦除后再写入。而SSD的寿命就是每个块的擦写次数,这个次数在几千次到几万次不等。
实际读写
白色代表没有写入过数据,绿色代表里面是有效数据,红色数据在操作系统看来是已经删除的。
一开始所有块的每一个页都是白色的。随着我们往里边写数据,有些页就变成了绿色。
当我们删除了硬盘上的一些文件的时候,某些页就变成了红色。 页变成红色时,再向里边是写不了数据的。
直到整个块都变成红色的时候,我们就可以将它擦除,这个块就又变成白色的了。
当我们没有白色的块写入数据时,我们就会找到一个红色最多的块,把绿色的页移到厂家预留的白色块中,再将这些红色多的块擦除。
磨损均衡和FTL
我们的硬盘上会存储操作系统和一些常用的软件,所以对于这些硬盘空间,一般都是读的操作,对SSD寿命损耗很小。而我们在开发代码的时候,我们需要不断的修改,对于这些硬盘空间就是在不断擦除和写入,是损耗SSD寿命的。
这样的使用对于固态硬盘就会产生一个问题,就是反复擦写的地方容易坏的快,经常只读的地方坏的慢。时间一长,固态硬盘的容量就会越来越小。我们该如何解决?
我们可以加一个中间层来控制每个块的擦写次数,从而达到磨损均衡。这个中间层就是闪存转换层,FTL。
在FTL里边,我们存放了逻辑地址块到物理地址块的映射,操作系统访问的都是逻辑地址块,只有经过FTL的转换才能找到物理地址块。所以FTL就能知道每个物理块的擦写次数,从而达到磨损均衡。
TRIM指令
当我们点击鼠标右键删除一个文件的时候,只是操作系统在逻辑上把它标记为可以写入。在实际物理层面,原来的数据还是存在的。当操作系统再向这个地方写入新数据时:
对于机械硬盘来说,新数据可以直接写来覆盖掉原来的数据。但是对于固态硬盘来说,这时候才能知道原来的数据已经废弃(标为红),然后把新数据存在新的地方。
也就是说,如果使用SSD硬盘,操作系统删除了数据的话,SSD硬盘是不知道的。这就导致了我们很多时候,在合并块删除废弃数据时,需要搬运很多操作系统已经删除的数据。不仅消耗了性能,还缩短了寿命。
为了解决这个问题,我们的操作系统和SSD都支持一种叫TRIM的指令。这个指令就是可以在数据被删除的时候,让操作系统通知对应的逻辑块已经标记成删除好让SSD不再做无用功。