SSD与RAM的原理有些类似,RAM使用晶体管和电容来表示0或1,晶体管用于将电荷转移到电容器或从电容器中吸取电荷,并且电荷必须每几微秒刷新一次。
而SSD相比于RAM的非易失性来自于其使用的浮栅晶体管。其创造了一个小笼子,不需要外界的电容来保持充电,并通过鼓励电子通过量子隧穿效应来进出笼子。
储存介质
NOR
使用晶体管最简单的方法是将每一行和每一列连接在一起,以便读取每个单独的位。这种特殊的布局在NOR flash中使用。连接每一行的电路称为“word line”,而连接每一列的电路称为“bit line”。读取操作在这种情况下非常简单:对每个word line施加一个电压,bit line将根据每个单元格存储的是0还是1来显示电压(或不显示)。
为了更详细地理解它是如何工作的,我们必须首先了解浮栅晶体管。一个普通的晶体管有三种连接方式,根据所用技术的不同分别命名为gate、drain和source
当电压加到gate时,电流就可以从source流向drain。当在栅极上施加低电压时,从source流向drain的电压与栅极电压成比例变化(因此,低栅极电压导致source流向drain的低电流,高电压导致高电流)。当栅极电压足够高时,比例响应停止。这使得晶体管既可以用作放大器(应用于门极的小信号会在source极产生成比例的大信号),也可以用作开关(仅在门极使用高电压或零电压,source极和drain之间要么有大电流,要么没有电流)。
浮动栅极位于栅极和晶体管的其余部分之间,它在一个重要的方面改变了栅极的行为。所述晶体管的浮栅部分中包含的电荷改变所述晶体管的电压阈值。当栅极电压高于某个值(称为Vread)时,通常在0.5 V左右,开关将始终闭合。当栅极电压低于这个值时,开关的开度由浮动栅极决定。
如果浮栅没有电荷,那么在栅上施加一个低电压仍然可以关闭开关,并允许电流从source流向drain。如果浮栅确实储存一个电荷,那么完整的Vread电压需要被施加到栅极以使电流流动。也就是说,无论浮栅是否包含电荷,晶体管的栅极必须施加多少电压才能导通或不导通。
在cell的网格中,word line与晶体管的gate相连接。bit line与drain相连。source连接到第三组线,称为source line。与bit line一样,同一列中的所有晶体管的source都连接在一起。
我们可以通过在门上施加低电压来读取单元的内容,看看是否有电流流过。具体来说,所述单元所连接的word line被通电到Vread以下的某个电压。当且仅当电池的浮栅不含电荷(a 1)时,电流将流过电池source line到其连接的bit line。如果浮栅含电荷(a 0),则整个电池的电压阈值过高,小电压无法克服。然后检查连接到该cell的bit line的电流。如果它有电流,则将其视为逻辑1;如果没有,则为逻辑0。
这种晶体管的排列方式在NOR flash中使用。它被命名为NOR的原因是它类似于字行上的逻辑NOR- low电流,与浮栅中的电荷无关。如果你应用Vread,浮栅没有电荷,那么位线显示电荷(0或0 = 1),而浮栅不会传导低读电流,如果它包含电荷(0或1 = 0)。
NOR虽然设计概念简单,但芯片本身相当复杂,因为NOR闪存要占用大量的word line和bit line连接——每个晶体管都必须有这些连接,这导致了大量的连接。实际上,我们不需要那种极端粒度的访问,相反,用户一次只能读写整个扇区就够了
NAND flash
NAND相比于NOR,其bit line发生了改变——每一列中的晶体管串联起来,一个晶体管的drain与另一个晶体管的source相连。
为了读取栅格内的单个位,bit line select和source select晶体管都被打开。然后,所有没有读取的字行都被应用了Vread,迫使晶体管导电,不管它们的浮动门是否有电荷。只有感兴趣的比特的word line有较低的电压。如果该位有一个存储电荷(因此是逻辑上的0),晶体管将保持开路状态,没有电流通过晶体管链。如果它没有储存电荷(因此是逻辑1),晶体管将关闭,电流将流过。在位线上检测到电流的存在或不存在,并分别视为1或0。所有位线将同时并行地传递一个信号。
与NOR flash相比,将flash单元的列串联起来可以消除大量的结构;用NAND flash构建的给定容量的存储空间比用NOR flash构建的相同结构所占用的物理空间少60%。
但也有一个缺点,那就是失去了单独读写每个比特位的能力。NAND flash一次只能读写一页(一行)的数据。与传统观点相反,NAND flash的布局本身并没有阻止单个单元格的读写;相反,为了坚持NAND flash的设计目标,即比NOR flash更简单、更小,NAND芯片可以接受和理解的标准化命令的结构使页面成为最小的可寻址单元。这节省了存储更多指令所需的硅空间,并能够保存单元到页的映射。
MLC
浮栅晶体管具有存储少量电荷的能力,而少量并不意味着单个,事实上还可以储存多个电荷水平,这就引入了MLC
相比于SLC
- MLC读取读取更复杂。需要依次测量每个可能的阈值电压,看看哪一个足以使晶体管打开。
- SLC更可靠、更简单、错误率更低。
- MLC更便宜
读写
覆盖
SSD能读写页,但却不能覆盖页。空页储存了1,1可以在页级别转换为0,但这个过程是单向的,也就是将0转换为1将是一个潜在的危险操作因为这会使用高压电,高压电将会使得相邻的cell也发生改变。当然也可以通过隧道抑制来防止——对周围的所有细胞施加非常大的电压,这样它们的电子就不会随着目标细胞一起隧穿——但这会导致cell上的的压力被清除。因此,为了避免损坏,ssd只能以整个块的增量进行擦除,而不是不需要耗能的隧道抑制
顺便说一句,虽然NOR闪存允许逐位写入,但它保留了其他限制:1s只能被0覆盖,并且将0重置为1s需要一次擦除整个块,这也是由于高压和如果以较小粒度执行会损坏相邻单元的风险。
这意味着SSD必须先擦除再写入。比如在8192(2^13)byte每页,256页每块的情况下,写入8kb的文件,会先复制2MB的数据到缓存,然后擦除整块,并重写这2MB数据。
这样带来的不利之处在于除非SSD有一个可用的已擦除页面准备就绪并等待数据,否则它不能立即执行写操作。如果没有已擦除的页面,它将不得不找到一个未使用(但尚未擦除)页面的块,擦除整个块,然后将块的旧内容与新页面一起写入。那么ssd会越使用越慢。
弊端
SSD尽管速度快,然而只能用于有限数量的写入。
我们已经知道,SSD中数据是通过改变单元行和列的电压来读取的,在写入的时候要通过量子隧穿效应迁移电子。
然而当每次电池经过程序/擦除周期时,一些电荷被捕获在构成浮栅的材料的介电层中。这种被捕获的电荷改变了栅极的电阻。随着电阻的变化,改变栅极状态所需的电流增加,栅极翻转需要更长的时间。随着时间的推移,这种电阻的变化变得足够显著,以至于将0写入单元所需的电压量变得如此之高,并且单元更改所需的时间变得如此之长,以至于单元作为快速数据存储设备的组件变得毫无价值
而MLC ssd比SLC ssd更容易退化,因为MLC驱动器中的每个单元有四种可能的状态并存储两个比特,因此每个单元对剩余电荷的变化更敏感,或者难以添加新电荷。此外,随着半导体工艺尺寸路线图的进一步缩小,闪存单元的尺寸也在不断减小。因为它们在物理上更小,在变得太无反应而无用之前可以吸收更少的剩余电荷。
权衡
对于SSD有两大问题——块级别擦除、有限生命周期
为了权衡,采用了以下方案
- over-provisioning: 总容量预留部分空间,方便写入
- garable collection:回收那些过时的页(也就是该页已经不是最新,被修改过的)。现在操作系统一般都不实际删除文件,在配置TRIM的情况下,操作系统可以发送SSD表明页不包含有效内容,那样SSD可以对这些操作系统认为删除的数据进行垃圾回收
写放大
写放大是逻辑写入次数和实际写入次数的差异。比如说要写入x=1,逻辑上只要写入一次,但实际上可能还有垃圾回收、块擦除等写入。
在SSD中会进行持续迁移,因此逻辑写入128KB数据,实际每次都会大于128KB
在ssd中写放大有以下情况引发
- 垃圾回收:若一个驱动正在努力保持最大可用空间,并由TRIM辅助,那么将会在没有任何用户输入的情况下执行大量写入,导致高写放大以及降低cell寿命
- 磨损均衡:磨损均衡是SSD维持所有cell使用情况在同一水平线的手段,会尽量占用那些使用比较少的cell进行储存
- 无空闲页:在无空闲页的情况下,每次写入将会先读再擦最后重写
Ref
- https://arstechnica.com/information-technology/2012/06/inside-the-ssd-revolution-how-solid-state-disks-really-work/