前言
不知道你有没有发现,每当买回来一块U盘,插入电脑发现永远比所标的容量小。
到底是谁偷走了我的容量?
真凶就是预留空间(Over Provisioning),简称OP。
预留空间OP是什么
了解内存开发的都会知道,一块Flash中能用的空间并不会全部用来做用户空间。
还有一部分空间会被用来做预留空间,用以做一些中间搬运的操作。
所谓用户空间,就是内存容量,也就是主机端能看到的存储容量。 预留空间,用户是看不到的,属于FTL层,用来做一些中间写操作。
我们假设一个Flash只有一个通道,那么肯定就只有一个Die,该Die有5个Block块(Block0~Block4),每个Block中有9个小方块,代表着9个page(后面说的Flash,也是用的这个假设容量)。
其中有多少用作预留空间是固件决定的事情,属于FTL层。
我们假设固件设置这Flash的前4Block为用户容量,那么另外1个Block就是用户容量之外的预留空间。
预留空间的种类
-
本征预留空间OP1
-
标称预留空间OP2
本征预留空间
市场上SSD标称的容量1K是按照1000来计算的,但是NAND闪存的容量中1K是按照1024计算的。
假设现在买到手一个1G的U盘,我们简单列个式子计算一下:
市场SSD标称: 1GB = 1000MB = 10001000KB = 10001000*1000Byte = 10^9Byte(1,000,000,000Byte)。
NAND闪存: 1GB = 1024MB = 10241024KB = 10241024*1024Byte =2^30Byte(1,073,741,824Byte)。
这两个计算方式之间正好相差7.37%。所以说该U盘的本征预留空间就有7.37%。
标称预留空间
标称OP是由于固件需要提升性能要求而故意预留出来的空间,大小由FTL来决定。
这个部分预留空间主要用于垃圾回收GC,暂存有效数据。
标称预留空间OP=(Flash总容量-用户空间)/用户空间。
预留空间的用途
-
更新数据
-
提供额外的空间暂存有效数据,为垃圾回收做准备
更新数据
假设往不断地往Flash中写数据,忽然某些逻辑地址的数据用户不想要了,想要更新新的数据进入。
由于Flash的特性是不能覆盖写的,写之前还必须进行整个Block的擦除。
为了避免擦除掉Block中有用的数据,用户更新数据,固件只能另外找空间写入新的数据,那原来的地址中数据就没用了,成立垃圾。
而这个另外找的空间,一般找的就是预留空间。
同时假设用户要在Block0上更新新数据,地址为Page0,数据量为1page时,固件会把新写入的page数据写到预留空间中。
这时候,预留空间Block4的page0就是Block0的page0的有效数据了。
而Block0中原来的page0的数据也就失效了,过期了,变成垃圾了。
随着更新的数据越来越多,垃圾数据也就越来越多了。
提供额外的空间暂存有效数据,为垃圾回收做准备
随着数据不断写入,用户空间被不断填充,直到整个盘被写满了。
从主机端看也就是整个用户空间被写满了,但是由于预留空间的存在,其实整个Flash并没有被写满。
但是按着这么写下去,总有一天用户空间被写满,预留空间也会被写满。
这时候如果还想写入更多呢?
没办法,只能将不想要的垃圾数据删除掉,腾出空间来,也就是做垃圾回收。
实际中不会等到所有的内存空间都写满了才做垃圾回收,而是在写满之前就在做回收了。
为了避免擦除Block的时候将其中的某些有效数据被删掉了,会先将Block上的有效数据读出来,写到一个新的Block上。
如下图,假设Block 0的有效数据为A、B、C,Block 1的有效数据为D、E、F;
垃圾回收就是找一个新的Block 4,将Block 0和Block 1的有效数据搬移到Block 4上。
这样Block 0和Block 0上就没有任何有效数据了.
Blcok 0和Block 1可以随时擦除,变成两个可用的Block块。
当然也有些厂商的FTL方案中,这个新的Block不一定从预留空间中找,也会在用户空间中找。
需要注意的是,在做完垃圾回收之后,需要把有效数据写回新擦除的Block中,这些Block剩下的空间,就能继续写入新的数据了。
预留空间的好处
牺牲了那么多本该数据用户空间的容量来做预留空间,自然是有好处的。
-
提高写入性能
由于有预留空间的存在,写入数据时并不需要经常做垃圾回收,加快了写入速度。
-
降低写放大WA
写放大的计算方法:WA = 写入闪存的数据量/用户写入的数据量
OP越大,写入Flash的有效数据就越少,WA自然就降低了。
-
增加闪存使用寿命
OP越大,可供的额外空间越多,就不用只盯着那几个Block去做擦读写,减少了某些Block频繁的擦读写次数和数据搬迁,增加使用寿命。
-
数据保护主要提供ECC之外的数据保护
这个几乎很少用到,这里就不讨论这个了。
写在最后
我记得曾经有人说过,思想和行动的区别在于:
想谈恋爱却高呼自由可贵,想进大厂却不想工作,想当大牛却不想学习,每个人都知道明天必须披荆斩棘的活下去,却依旧浑浑噩噩的度过今天。
不用去怀疑自己的能力,你只需要一份靠谱的学习资料,一个学习的deadline以及一个没学完就打爆你狗头的人,很快你就会被自己的才华和能力所惊艳。
我收集了一些linux的资料,算法小抄和计算机基础的资料。
以下资料仅供个人学习使用,欢迎大家一起学习探讨。
希望以上内容能帮助到你,祝各位生活愉快。