谁偷走了我的存储容量?预留空间OP参上!

大家好,我是五月。

前言

不知道你有没有发现,每当买回来一块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保姆级教程完整版文档资料

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/102008.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Go语言】基于Socket编程的P2P通信程序示例

Go语言的Socket编程实现为开发者提供了一种高效且强大的方式来实现网络通信。通过Go语言的并发模型和内置的网络库,如net包,开发者可以轻松地创建基于套接字的通信应用。Go语言的goroutine和channel机制使并发处理变得简单,能够轻松处理多个连…

【硕士论文完美复现】【价格型需求响应】基于需求侧响应的配电网供电能力综合评估(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part II

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法 Part II 如何下载和安装openCV和Cmake可以看这篇文章。 用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022openCV4.8.0) Part I_松下J27的博客-CSDN博客 下面我…

Seaborn数据可视化(三)

1.绘制直方图 使用displot()绘制直方图。 import seaborn as sns import numpy as np import matplotlib.pyplot as plt# 生成随机数据 np.random.seed(0) data np.random.randn(1000)# 使用displot绘制直方图 sns.displot(data, bins10, kdeTrue)# 展示图形 plt.show() 结…

国内ChatGPT对比与最佳方案

很久没写内容了,主要还是工作占据了太多时间。简单分享下我这段时间的研究吧,由于时间仓促,有很多内容没有具体写,请自行到我分享的网站体验查看。 前言 ChatGPT 的出现确实在很大程度上改变了世界。许多人已经亲身体验到了ChatGPT作为一个…

关于打包多模块SpringBoot项目并通过宝塔上传服务器

打包 —— 如何打包多模块项目,参考b站up主:[喜欢编程的代先生] 的视频 总结:1. 对着视频里看一下父模块和各个子模块pom.xml文件关于打包工具的依赖是否正确。2. 从最底层开始打包,逐层向上,最后再合并打包。 部署 …

Git拉取分支、基于主分支创建新的开发分支、合并开发分支到主分支、回退上一次的merge操作

系列文章目录 第1章 Git拉取分支、基于主分支创建新的开发分支、合并开发分支到主分支、回退上一次的merge操作 文章目录 系列文章目录一、拉取分支二、如何从master分支创建一个dev分支三、如何将dev分支合并到master分支四、如何回退上一次的merge 一、拉取分支 项目文件夹…

Newsprk Newspaper新闻报纸WordPress主题

Newsprk Newspaper新闻报纸WordPress主题对于任何使用 WordPress 技术构建的新闻和杂志网站来说都是一个有吸引力且时尚的主题。Newsprk – 报纸 WordPress 主题非常适合任何新闻/杂志或与以下类别匹配的任何特定业务,如博客、体育、时尚、科学、足球、政治、视频、…

数据结构——队列(C语言)

需求:无 本篇文章将解决一下几个问题: 队列是什么?如何实现一个队列?什么场景下会用队列? 队列的概念: 队列:一种只允许一端进行插入数据操作,在另一端进行删除操作的特殊线性表。…

T599聚合物电容器:在汽车应用中提供更长的使用寿命的解决方案

自从电子技术被引入汽车工业以来,汽车的技术含量一直在提升。诸多技术被应用在汽车上,使汽车的形象更接近于轮子上的超级计算机。更多传感器、更强大的计算能力和电力被装载到汽车上,汽车应用中的电子产品数量正在迅速增长。随着电动汽车和自…

优思学院|公司质量的重要性与六西格玛的应用

在现代商业环境中,公司的成功与否往往取决于其产品或服务的质量水准。质量不仅是公司的一个重要组成部分,还直接影响着公司的声誉和消费者认可度。保持高质量的商品和服务有助于建立客户信任,维护品牌形象,并确保长期的业务增长。…

品牌渠道价格治理的标准和方法

当品牌渠道中有低价、窜货链接时,则需要进行价格的治理,因为低价一旦放任不管,将使渠道秩序更加混乱,会引起更多经销商的低价跟价,同时还可能影响品牌口碑,降低消费者的购买黏性,所以治理低价、…

攻防世界-simple_js

原题 解题思路 js就看源代码,pass是数字,下面还有一串十六进制的编码。 进制转换就是,也是一串数字,那把这两串数字都拿去转ASCII码。 s1 [55,56,54,79,115,69,114,116,107,49,50] s2 [70,65,85,88,32,80,65,83,83,87,79,82,68…

回归预测 | MATLAB实现GA-ELM遗传算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GA-ELM遗传算法优化极限学习机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现GA-ELM遗传算法优化极限学习机多输入单输出回归预测(多指标,多图)效果一览基本介绍程序…

隧道vs免费爬虫ip:为何要选择隧道爬虫ip?

在网络爬虫的世界中,爬虫ip是一项关键技术,它可以帮助我们隐藏身份、突破限制、提高抓取效率。但是,在选择爬虫ip时,我们常常会面对隧道爬虫ip和免费爬虫ip之间的抉择。在本文中,我们将探讨隧道爬虫ip相对于免费爬虫ip…

vue:this和that的理解

当我们进入公司的时候会发现一个很常见的情况,就是你的前开发者会常用这么一个变量:that、self… 为什么会用到that、self呢,小编是这么理解的,this指向的是当前的对象,而that、self是临时的变量,为了临时存…

SQL注入之联合查询

文章目录 联合查询是什么?联合查询获取cms账号密码尝试登录 联合查询是什么? 适用数据库中的内容会回显到页面中来的情况。联合查询就是利用union select 语句,该语句会同时执行两条select 语句,实现跨库、跨表查询。 必要条件 两…

基于AVR128单片机世界电子时钟的设计

一、系统方案 上电初始化完成系统初始化,液晶滚动显示北京、莫斯科、东京、伦敦、巴黎、纽约等六个城市的标准时间,显示的内容包括地区名及相应地区的年、月、日、星期、时、分、秒。 使用K1按键控制滚动显示或稳定显示某个地区的时间。 使用K3、K4、K5按…

net start Mysql 启动服务时 ,显示“Mysql服务正在启动 Mysql服务无法启动 服务没有报告任何错误

一、问题 有时候,输入net start Mysql 启动服务时 mysql>net start Mysql 显示 Mysql服务正在启动 Mysql服务无法启动 服务没有报告任何错误 二、原因 由于mysql的默认端口是3306,因此在启动服务的时候,如果此端口被占用,就会出…

Java使用MyBatis、JDBC批量插入数据

使用MyBatis、JDBC做大量数据插入 准备 表结构 CREATE TABLE tb_users (id varchar(255) NOT NULL,name varchar(100) DEFAULT NULL,age int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;MyBatis配置文件 <?xml version"1.0" enc…