【梳理】简明操作系统原理 第十五章 SSD(内附文档高清截图)

参考教材:
Operating Systems: Three Easy Pieces
Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau
在线阅读:
http://pages.cs.wisc.edu/~remzi/OSTEP/
University of Wisconsin Madison 教授 Remzi Arpaci-Dusseau 认为课本应该是免费的。
————————————————————————————————————————
这是专业必修课《操作系统原理》的复习指引。
在本文的最后附有复习指导的高清截图。需要掌握的概念在文档截图中以蓝色标识,并用可读性更好的字体显示 Linux 命令和代码。代码部分语法高亮。
操作系统原理不是语言课,本复习指导对用到的编程语言的语法的讲解也不会很细致。如果不知道代码中的一些关键字或函数的具体用法,你应该自行查找相关资料。

十五 SSD

1、 基于与非门的闪存(NAND-based flash)由舛岡富士雄(Masuoka Fujio)于1986年发明,被用作U盘和固态硬盘(solid state drive,SSD)的存储颗粒。NAND Flash让东芝(Toshiba)成为了世界半导体巨头。

2、 有的闪存中,单个晶体管可以表示超过1个bit,这是通过向晶体管中存储不同数量的电荷实现的。SLC(single-level cell)、MLC(multi-level cell)、TLC(triple-level cell)和QLC(quad-level cell)闪存中,每个晶体管分别存储1个bit、2个bit、3个bit和四个bit。

3、 闪存被分成许多个bank,或者叫plane。一个bank可以按块(block)访问,闪存的块大小的两个常用值是128 KB、256 KB;也可以按页(page)访问,一页通常为4 KB。一个bank有很多个块,一个块有很多页。

4、 对闪存的基本操作有三种:
【1】读取(read)。一次读取至少要读取一页,并且读取闪存的任何位置的时间理论上是一样的。也就是说,闪存支持随机访问(random access)。
【2】擦除(erase)。一次擦除至少要擦除一块,擦除会将整个块置1。擦除的开销比读取大得多。
【3】编程(program)。一次编程至少要写入一页。当一个块被擦除以后,就可以将其重新写入。写入的开销比读取大得多。写入之前要先将所在块的内容备份到别的位置,然后擦除该块,再进行写入。

5、 SSD使用闪存,其读写速率都远快于机械硬盘。并且,SSD没有运动的机械部件(HDD则包含运动的盘片、磁头),因此不易因为外界震动受到冲击,导致损坏。目前限制SSD普及的,主要是单位容量价格。

6、 当对闪存进行擦除或写入时,每次都会累积一点点额外电荷。当写入、擦除次数达到一定程度后,这些累积的电荷使得0和1无法再明显地区分开来,这个块就废了。SLC的理论P/E(Program / Erase)次数约为10万次,MLC约为1万次,TLC约为1千次。当然,随着新技术的诞生,比如非易失性(non-volatile)闪存新技术3D Xpoint可以将闪存的寿命提高数倍。但必须记住:无论是HDD还是SSD,都有一定几率在达到标称寿命之前损坏。

7、 在访问Flash的一个特定页面时,邻近区域可能会受到电磁影响,从而导致记录的位翻转,称为读取干扰(read disturb)和写入干扰(write disturb)。闪存控制器(flash controller)需要及时介入,将干扰修正。

8、 向后兼容(向下兼容,backward compatibility)是设计计算机硬件和软件的过程中的一个必须考虑的方面。Windows和Linux已经更新了许多代,但是有大量的API保持不变;存储设备也在不断发展,但磁盘也对文件系统提供基本没有变动的界面(基于块)。网络协议也在不断改变,但一些层的结构基本不变。向后兼容能够极大降低研发成本。但它并不是没有劣势的:过度的向后兼容会累积太多的历史包袱,对新技术的引入与发展产生严重制约。是否维持向后兼容、向后兼容到什么程度,应当根据具体场景谨慎决定。CPU经过了数十年的发展,指令集越来越多。大多数新的CPU都能兼容旧的指令集,但一些非常古老的指令集已经被淘汰,比如3DNow!指令集已经不被新的Intel CPU支持。而MMX指令集也有可能被日后的Intel CPU放弃。

9、 一张SSD的基本结构如下:

SSD包含许多闪存颗粒,以及若干片缓存(例如:几个GB左右的DRAM),还有闪存控制器,以及接口。
控制器中具有闪存翻译层(flash translation layer,FTL)。这一层为操作系统提供兼容的磁盘结构,即逻辑块(logical block),然后将操作系统发来的读写命令转换为对物理页和物理块的读写命令并执行。为了提升性能,写入被尽可能分散到多块闪存上,这样就可以同时对多个颗粒并行操作。逻辑块和物理块的大小一般是相同的。
控制逻辑的另一个目标是减少写入放大(write amplification)。写入放大是一个比值(系数),为FTL实际写入的字节数与请求写入的字节数之比。写入放大系数大于1时,意味着实际写入的字节数比客户机请求写入的字节数多。
FTL还要负责进行磨损平衡(wear leveling),将集中在少数区域的频繁写入尽量分散到更多的区域去,防止部分区域过早损毁。
控制器将准备编程的页从低地址到高地址排序,按顺序编写。这种措施可以最小化读写干扰。

10、 怎样将逻辑块映射到物理块?最简单的办法自然是直接映射(direct mapped)。编号为N的逻辑页直接对应物理页N。要读取N很简单;要写入N的时候,需要先将页的内容保存下来,然后擦除该页,再写入新内容。
你已经猜到了:这种方法在性能和可靠性上都有大问题。当写入时,因为只是死板地套用这种简单直接的规则,因此写入放大系数达到了块大小与页大小之比。这种方法会令SSD的速率慢于传统的HDD。另外,OS中总是有一些内容是需要频繁修改的,比如元数据和某些用户数据。如果采用该方法,存放这些数据的块很快就会损坏。
出于这些理由,许多FTL是日志结构的(log structured)。这种思想在LFS里已经介绍过。当写入逻辑块N时,将新内容写入后续的空闲区域。设备会维护一个映射表(mapping table)(在主机内存、SSD板载内存(常用)中或闪存中),总是指向信息的最新版本,最新的页是有效页(valid page),旧数据所在的页成为无效页(invalid page)。映射表会保存每个逻辑块的地址。

11、 假设突然断电了,如何恢复映射表呢?最简单的办法是为每一页开辟OOB(out-of-band)区域。当侦测到从非正常关机中恢复时,SSD会扫描OOB区域并重建映射表到内存中。当然,在大容量的SSD中扫描恢复信息很慢。为了解决这个问题,日志(logging)和检查点(checkpointing)技术被引入。这两种技术已经在第十四章中介绍LFS的部分介绍过。

12、 使用日志结构FTL的SSD中,写入新内容后,由于新内容在其它空闲块写入,因此旧有的块就成为垃圾块(garbage block,也称死块,dead block)。垃圾回收(garbage collection,GC)机制常在空闲时自动运行,可以及时(或者说,提前)擦除旧数据。如果不进行垃圾回收,那么假如写入时遇到没清除干净的数据,会导致写入操作需要先清除块再改写,将严重影响写入速度。GC保证速度不下跌的真正秘密是:把将来要做的事提前做掉了——就像你提前进行复习、提前做好留学准备那样。但是这件事迟早要做,所以理论上不影响SSD的写入次数(寿命)。
与LFS类似,借助映射表可以检查块中是否含有垃圾页。如果是,则清除该块;如果块内有其它非垃圾页,则需要重新写入这些页。因此,垃圾回收的开销还是比较大,因为需要不断读取、擦除、重写。
为了降低垃圾回收的开销,SSD通常会预留空间(over-provisioning,OP)。这部分容量不包含在标称容量之内,可以令Trim(见第13点)延迟并尽量在SSD负载较低时进行。预留的空间虽然对用户不可见,但是SSD写入新数据时仍然可能写入到预留空间中。只是在后续的垃圾回收过程中,可以直接擦除旧数据所在的块而不用重写它们,减小写入放大、提升性能、延长使用寿命。另外,由于预留的这部分容量意味着闪存颗粒数量的增加,实际上对标称容量相同的SSD,在其它条件基本相同时,预留空间更多的SSD的表现常常更好。
OP一般分三层。第一层容量固定为SSD标称容量的7.37%,这是因为标称容量采用千进制为单位,而NAND颗粒容量单位为1024进制,两者正好相差约7.37%。这部分空间被默认用于OP。第二层OP是否存在及容量大小取决于厂商设置。第三层OP是用户在日常使用中可以分配的,像Fusion-IO公司还给其用户提供工具让他们自行调节大小以满足不同的耐用度及性能要求。一般用户也可以自己在初次分区的时候,不把所有的SSD容量都分满来达到相同目的,此处有一点要注意,若非首次分区就留出空间,必须要先进行全盘擦除(Secure Erase),否则没有效果。

13、 Trim操作将块地址发送给设备,通知设备该块的数据已经被删除。在接下来的垃圾回收中,这个块会直接被清除,不用重写。对于传统的机械硬盘,Trim没有太大用处,因为在机械硬盘上删除数据时,只需要在逻辑地址表的相应位置做标记,在接下来写入这片空间时,可以直接覆写;但对SSD,为了避免不必要的写入前擦除、减小写入放大、提升性能,Trim是强烈推荐开启的。在叠瓦式磁记录(Shingled magnetic recording,SMR)硬盘中,由于磁道重叠,在写入磁道时也会影响写入位置周围的数据,因此必须将被影响的数据重写。同样为了避免不必要的写入前擦除、减小写入放大、提升性能,Trim机制也是需要的。但是SSD能一次读写多个闪存,而机械盘的一个盘面只有1 ~ 2个磁头,因此Trim本身也会令磁盘占用时间过长,导致体验下降。
Trim和GC两个机制使得恢复SSD中被删除的文件十分困难。

14、 不应该对固态硬盘进行碎片整理,否则会严重影响其寿命。对于机械硬盘,经常进行磁盘碎片整理也会对寿命造成负面影响。

15、 如果SSD的页大小为4 KB,而映射表为每一页都记录一个4字节的项,那么一个1 TB的硬盘就需要1 GB的内存空间来存放映射表。一个减小映射表占用空间的办法是:将映射表改为按块记录。
但是这种做法会降低性能。因为在收到读写请求后,由于映射表中只有逻辑块地址(logical block addressing,LBA)对应的地址翻译结果,所以通过取高若干位取得块地址后只能找到物理块开头的那个地址,之后还需要将逻辑块内的偏移与翻译结果相加,才能找到包含在翻译结果指向的物理块内的所在页。
并且,单纯的按块记录不利于随机写入:如果一个块中的某页需要更新,由于映射表需要始终指向最新的数据所在的块,因此需要将这个块的数据复制到另一个物理块中(回忆:逻辑块和物理块的大小通常是相同的),然后将更新的数据写入新分配的物理块中。旧块随后被擦除(回收)。这种方法会引起频繁的擦除和不必要的有效页复制(valid page copying)。
混合映射(hybrid mapping)机制有许多变种。如果想详细学习,请参阅相关的论文。这里只做简要介绍。
实现混合映射需要维护两个表。一个是日志表(log table),该表按页记录,被记录的块称为日志块(log block);一个是数据表(data table),该表按块记录,被记录的块称为数据块(data block)。数据块用于存储数据,日志块用于存储数据块中的数据更新后的新数据。
当查找逻辑块对应的物理位置时,FTL先查询日志表,查询不到结果时再查询数据表。频繁更新的块按日志块对待,对应的映射表是按页记录的。通常情况下,只有小部分数据更新频繁,大部分数据更新一般较少,因此这个方法比较奏效。现在的许多SSD都采用了混合映射机制。
为了确保两张表的总大小不过大,FTL会将一些日志块转换成数据块。
在顺序写入中,比如上一次正好写入了一整个块,这一次又将该数据块覆写。回忆LFS更新数据的过程,容易理解:日志结构的FTL会将新数据写到新的日志块上,并修改映射表的相应标记。FTL可以在随后将日志块置为数据块,该转换过程称为切换混合(switch merge)。覆写完毕后,原有的块在之后被擦除。这种情况是最好情况。
但是,对于这样的情形:比如先写入一整个块,然后只改写其中的少量页面,就不能这样子转换了。当然应对这种半顺序读写(semi-sequential writing)的方法也不是没有,部分混合(partial merge)可以解决这个问题。在刚才的例子中,假设后来改写的是逻辑块开头的连续的几页。更新后的数据写在新的日志块中,然后部分混合比切换混合多出来一步:剩余的未修改页被复制到新的日志块。接下来的操作与切换混合一致:这个日志块被转为数据块。旧的块也在稍后被擦除。但是部分混合会带来额外的IO操作,并增加写入放大。
随机写入,也就是说许多块中都只有少量页面更新,这种情况是最坏情况。这时候需要进行全混合(full merge)操作。
首先分配空闲块,然后把旧数据块和 / 或日志块中的有效页写入到新的空白块中,把写入新数据的日志块置为新的数据块,把旧的数据块和 / 或日志块全部擦除。

16、 一种减少映射表的SSD板载内存占用的方法是只保留频繁使用的那部分在内存。如果需要映射表的其它内容,就需要到闪存中将其取回内存。这种情况与相应的机制和计算机内存的交换相同,不再赘述。

17、 日志结构的SSD本身自带一定程度的磨损平衡。但是,如果SSD中有的数据长期不更改,这部分区域也就无法被用于磨损平衡。为了解决此问题,FTL周期性将这些区域的数据转移到另外的区域。这一定程度上增加了写入放大。磨损平衡算法也有许多改进的方案。

【梳理】简明操作系统原理 第十五章 SSD(内附文档高清截图)_第1张图片【梳理】简明操作系统原理 第十五章 SSD(内附文档高清截图)_第2张图片【梳理】简明操作系统原理 第十五章 SSD(内附文档高清截图)_第3张图片【梳理】简明操作系统原理 第十五章 SSD(内附文档高清截图)_第4张图片【梳理】简明操作系统原理 第十五章 SSD(内附文档高清截图)_第5张图片【梳理】简明操作系统原理 第十五章 SSD(内附文档高清截图)_第6张图片【梳理】简明操作系统原理 第十五章 SSD(内附文档高清截图)_第7张图片【梳理】简明操作系统原理 第十五章 SSD(内附文档高清截图)_第8张图片【梳理】简明操作系统原理 第十五章 SSD(内附文档高清截图)_第9张图片【梳理】简明操作系统原理 第十五章 SSD(内附文档高清截图)_第10张图片

你可能感兴趣的:(专业课,#,操作系统原理)