这周我看了《Inside Solid State Device》一书,了解了解SSD作为软件的补充。
固态硬盘区别于将数据以磁形式存储的机械硬盘,使用了一种名为NAND的闪存颗粒,以电信号的形式存储数据。存储介质利用半导体的特性,以高低电平来标记数据的类型。NAND颗粒又以最小存储单元的堆叠形式不同而分为SLC(single-level cell)颗粒、MLC (multi-level cell)颗粒和TLC(triple-level cell)颗粒。单个slc存储单元有0和1两种充电值,(高电平记为“1”,标记为空白,低电平标为“0”,标记为存储)可存储1bit的数据;单个mlc存储单元有四种充电值——00、01、10和11,可存储2bit数据;以此类推,单个tlc存储单元有8种充电值,可存储3bit数据。slc颗粒的结构简单、稳定,具有高速、安全、使用寿命长的特点,(寿命约为100000次完全Program/Erase)而mlc颗粒相比slc颗粒,拥有更高的存储密度,也因为结构的复杂,需要牺牲一定的速度和使用寿命(寿命约10000次完全P/E),tlc则同理,存储密度相比slc有了很大的提升,但速率和使用寿命也大幅下降。(寿命约为500-2000次完全P/E)
2012年开始,民用固态硬盘规模迎来了一次井喷,原因是MLC颗粒的商用开始成熟,解决了传统的SLC颗粒生产成本高的问题,将这种高速安全的存储介质带入民用市场。同样,2015年,解决了使用寿命问题的TLC颗粒凭借成本优势开始逐步取代MLC颗粒。目前,市场在售的大部分固态硬盘都是用TLC颗粒生产而来。
机械硬盘的读写原理是通过机械马达带动机械臂上的磁头对磁碟片进行读取和写入,而这种方式最大的弊端就是寻址要花费至少10ms的时间,从而带来了巨大的延迟,影响了用户的体验。固态硬盘则不存在这样的问题,闪存颗粒的寻址只需要花费约0.1ms。但是固态硬盘也存在天然的缺陷,通过电信号存储数据的方式虽然读写速度快,但是一旦存储颗粒出现问题,数据恢复的几率几乎为0。存储颗粒出现故障的几率随着其读写次数的增多也在不断增加。数据的安全问题似乎是固态硬盘的死穴,特别是随着大量TLC颗粒的固态硬盘的上市,人们越来越关注如何延长固态硬盘的使用寿命(以提高完全读写次数这种方式为主),降低使用时的故障率,保持寿命内的读写速度。目前,固态硬盘中有几种方式来实现这一目的。
首先是磨损均衡(wear leveling)
由于系统在向固态硬盘写入文件时,并不全是完全的顺序写入,大部分时间都是随机写入,文件在系统中体现的逻辑位置和在固态硬盘中的物理位置通过LBA(Logical Block Addressing)表格一一对应,而当固态硬盘的主控发现某些区块的颗粒已经进行了相对多次的擦写,某些区块只进行了相对少次的擦写,会将文件写入相对少次的区块,以平衡各区块间的磨损程度,不致使某些区块提前透支使用寿命,使固态硬盘提前报废。
trim
机械硬盘对删除后重新写入的过程,仅需要磁柱头直接改变碟片上的磁信号,不存在擦除的过程。而固态硬盘对“删除”的理解,则只是在LBA表格中删除对应文件的逻辑位置信息,使系统找不到这个文件从而认为该文件已删除。当该物理区块又有文件写入时,则会先对对应写入的区块进行擦除,然后再写入。若该区块中还包含其他有效的文件,还需要先将该区块中的有效文件复制改写到其他区块中,然后擦除该区块,再进行写入。本来单纯的写入过程却变成了复杂的过程,降低了整体的响应速度。trim就是为解决这一问题而生的。微软在Windows7系统中开始加入对固态硬盘的trim指令。它的作用是,当系统在逻辑层面对文件进行删除时,固态硬盘在物理层面也对对应区块进行擦除,其中的有效文件会提前进行转移改写,保证了使用的速度。
垃圾回收(Garbage Collection)
由于大量的随机写入,固态硬盘中存在着一些小的有效数据,它们分布在不同的区块中,文件大小不足以占用整个区块。固态硬盘的主控会在系统空闲时,将这一部分的文件复制入系统内存中,自动缓存的固态硬盘会复制入自带的缓存中,然后将这一部分文件写入其他的区块,再将原区块擦除,保证原区块的写入性能。这一机制类似于机械硬盘的磁盘碎片整理。
预留空间
因为固态硬盘的垃圾回收机制和改写机制会占用其他空白的区块,所以在一定程度上来说,预留的空白空间越大,对保持固态硬盘的读写速度越有利。
静动数据分离
固态硬盘主控会识别LBA中数据的读写次数,对不经常写入的静态数据(系统文件,软件安装文件)和经常写入的动态数据进行归类分离,在有文件写入时,会主动写入存有动态数据的区块,避免改写静态数据造成性能浪费。
总结
固态硬盘的主控在整个固态硬盘中起到了重要作用,甚至可以说一个主控的优秀与否决定了这个固态硬盘的寿命和性能。竞争激烈的市场上,主控性能的提高也带来了强大的竞争力。在即将到来QLC颗粒上更需要依靠主控严格的纠错和算法的优化,才能保证必要的性能。