设为首页 加入收藏

TOP

谁偷走了我的存储容量?预留空间OP参上!
2023-08-26 21:09:51 】 浏览:261
Tags:储容量 空间 参上
?大家好,我是五月。

前言

不知道你有没有发现,每当买回来一块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的资料,算法小抄和计算机基础的资料。

以下资料仅供个人学习使用,欢迎大家一起学习探讨。

linux保姆级教程完整版文档资料

希望以上内容能帮助到你,祝各位生活愉快。

?
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【GTK】布局容器 下一篇C语言笔记 - “%”符号的用法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目