软硬件融合技术内幕 终极篇 (10) —— 数据持久化的秘密 (上)

2023-02-25 14:11:35 浏览数 (1)

在上一期,我们给大家讲述了DRAM的演进过程。DRAM和Cache缓存等,实际上都属于RAM,在计算机系统掉电后,DRAM中储存的内容会永久丢失。

那么,有没有合适的方法让数据能够在断电后继续保存(持久化存储)呢?

早在1877年,爱迪生作为聋人,发明了留声机。最早的留声机将声音信号将机械方式(唱片和拾音器)持久化保存,随后又出现了利用电磁方式持久化保存数据的方式,如磁带、磁鼓或磁盘等。但是,这些存储方式有一个共同点:需要利用机械组件完成寻址的动作,在随机读写方面的性能无法满足越来越高的业务需求。如何使用电子技术实现数据的持久化存储就成了一个很有意思的课题。

最早的电子持久化存储叫做PROM(Programmable Read Only Memory)。PROM可以一次性编程,将数据固化到存储器中。由于PROM编程的方式为通过外部电压烧毁部分预设的电路来实现,其内容是不可改写的。因此,工程师们又设计了可以用紫外线灯擦写的EPROM、直接通过电压的变化进行擦写的EEPROM等。当然,从性能的角度看,Flash (闪存)成为了持久化存储芯片的主流。

与DRAM类似,Flash芯片的内部也由一个一个单元构成。

如图,Flash ROM的每个存储单元是一个场效应管(MOSFET)。我们知道,MOSFET管的一个物理特性,是内部可以储存少量的电荷。我们利用这个特性就可以让MOSFET管存储0或者1。

与经典的MOSFET不同的是,Flash ROM中构建存储单元的MOSFET有两个栅极,上方的叫做控制栅(Control Gate),下方的叫做浮动栅(Floating Gate)。当浮动栅打开时,存储单元的电压会变得与控制栅一致,也就是完成了Flash的写入。而浮动栅关闭的时候,可以从控制栅读取MOSFET管中的电压。

由于Flash芯片的基底材料为具备高度绝缘性的二氧化硅,注入到MOSFET管中的电荷可以长期保存,因此,即使断电,Flash芯片存储的内容也不会丢失。

我们知道,对于内存,每个单元只能存储一个bit的数据。而为了降低成本,工程师们会设法在一个Flash的单元,也就是一个MOSFET管中,存储多于一个bit的数据。这是如何实现的呢?

每单元存储1bit的实现最为简单。如工作电压为12V,那么12V代表1,0V代表0。

如果我们需要在每个单元中存储2个bit,那么需要4种电平,如12V代表11,8V代表10,4V代表01,0V代表00。

以此类推,我们如果定义8个和16个电平阈值,就可以在1个MOSFET中存储3bit和4bit数据。

这四种工作方式的flash被称为SLC,MLC,TLC和QLC。可想而知地,QLC的每bit成本最低,而SLC成本最高。

那么,TLC和QLC这种Flash有什么缺点呢?

Flash虽然与RAM类似,都是利用半导体场效应管的电平高低来储存数据的器件,但Flash并不是按bit 来写入的。Flash出厂时的内容为全1,也就是每个Byte都是0xFF (11111111b)。需要写入的时候,会将一部分bit从1变为0。如写入0xCC (11001100b)的时候,会将bit 0,bit 1,bit 4和bit 5写为0。而这个过程是不可逆的,不可以再把内容为0的bit重新写入为1。

那么,如果我们需要把0xCC所在的这个字节重新写入为0xAA,应当怎么做呢?

Flash内部的存储单元是按Byte-Page(页)-Block(块)三级组织的。每个Page为4K Byte,每个Block大小为64-4096个Page(这个规格取决于生产商)。在Flash擦除的时候,需要将这个字节所在的Flash块整体擦除!

那么,我们如果需要改写一个Page的内容,只要Page所在的block不是未分配的,控制器就需要先读取目的page所在的block上的所有内容,擦除整个block,再写入修改后的整个block。

如果每个Block大小为1MB(256个4K Page),实际上每次写入的数据会被放大256倍。这也就是所谓的写放大。实际写入block数与需要写入block数的比例,叫做写放大因子(WAF, Write Amplification Factor)。显然,如果对于理想情况下的连续写,可以擦除整个block后连续写入block中的所有page,WAF趋近于1,而完全随机写,有可能WAF为一个block中的page数量。由于只有对未分配的block写入才会出现写放大,SSD的写性能会在空间将满时急剧下降。特别地,对于QLC闪存,这种现象会更加显著。

那么,我们有没有办法解决这一问题呢?

请看下期。

0 人点赞