【重要】NAND Flash基础知识简介

news/2024/4/30 3:27:52/文章来源:https://blog.csdn.net/lyd0813/article/details/132632164

NAND Flash是一种非易失存储介质(掉电后数据不会丢失),常见的U盘、TF卡/SD卡,以及大部分SSD(固态硬盘)都是由它组成的。 本文主要介绍其组成及工作原理。

为了表述方便,后面所说的Flash仅指NAND Flash。

一、Flash基本组成单元:SLC/MLC/TLC

Flash的基本组成单元是浮栅晶体管,其状态可以用来指示二进制的0或1。写操作就是往晶体管中注入电子,使之充电;擦除操作则是把晶体管中的电子排出,使之放电。由于这是个模拟系统,晶体管并不存在绝对的空和满状态,其中的电子数目可以处于空和满之间的任一个状态。

由此可见,可以根据晶体管中电子的数目来指示二进制的0和1。比如在SLC(Single Level Cell)中,晶体管中电子数目小于50%的时候代表1,大于50%的时候代表0。

SLC是对电子数目做的一阶量化,所以一个晶体管可以代表两个状态:0和1。如果我们对晶体管中的电子数目做二阶量化,一个晶体管就可以代表四个状态:少于25%代表00,25% ~ 50%代表01,50% ~ 75%代表10、大于75%代表11。这就是MCL(Multi Level Cell)的做法。

当然我们还可以对晶体管中的电子数目做三阶量化,一个晶体管就可以代表八个状态:000、001、010、011、100、101、110、111。这是TLC(Three Level Cell)的做法。

也就是说,量化等级越高,一个晶体管可以表示的状态越多,存储密度就越大,同等数量的存储单元组成的存储介质,存储容量也越大。

晶体管电子数目量化示意图

晶体管电子数目量化示意图

如上图所示,可以把晶体管比作水桶,晶体管内的电子比作水:

  • 由于SLC只有两个状态,只需要保证电子数目多于一半或少于一半即可,所以注入/排放电子的过程比较简单,执行起来很快;对于MLC,有四个状态,对注入/排放电子的精度要求就比较高,执行起来就没那么快了;对于TLC,有八个状态,对注入/排放电子的精度要求更高,执行的就更慢了。另外,写入的数据也会影响效率,比如对于MLC,写入代表满状态的00和代表空状态的11,效率要高于01和10(清空一杯水和倒满一杯水肯定比倒1/4,、1/2杯水简单,当然这个影响在业务层看来可能比较小)。
  • 另一方面,如果水桶发生损坏,比如在上半部分产生了一个缺口(擦除操作会导致介质磨损,最终导致电子泄露),对于SLC可能没影响,可以正常使用,对于MLC和TLC可能由于无法区分多个状态,就无法使用了。NAND Flash的寿命在很大程度上受所用存储单元类型影响,单个晶体管中存放的状态越多,容错性越差,寿命越短。

不同组成单元对Flash性能和寿命的影响

从上面的原理可以看出,SLC、MLC、TLC的性能和寿命是递减的,存储密度是递增的。 下面是一组具体的数据:

性能和寿命

性能和寿命

从上图可以看出:

  • 随着每个单元代表的比特数增加,读、写、擦除耗时也在增加
  • 无论是SLC还是MCL、TLC,擦除耗时(ms数量级)都远高于读写耗时(us数量级)
  • SLC的擦写次数远大于MLC、TLC,也就是说寿命长。
  • SLC每个晶体管只能代表一个比特,从存储密度看,是最低的,TLC存储密度最高,MLC次之。

总的来看,SLC的性能、寿命、稳定性是优于MLC的,当然价格也更贵,MCL次之,TLC最次。

二、Flash的结构及特点

Flash的结构

Flash中存在下面几个基本概念:package、die、plane、block、page(page对应于普通硬盘HDD中的sector,即常说的扇区)。 下面是一个示意图,我们由大到小拆解下:

  • package是存储芯片,即拆解固态硬盘或者SD卡后看到的NAND Flash颗粒。
  • 每个package包含一个或多个die。die是可以独立执行命令并上报状态的最小单元。
  • 每个die包含一个或多个plane(通常是1个或2个)。不同的plane间可以并发操作,不过有一些限制。
  • 每个plane包含多block*,block是最小擦除单元
  • 每个block包含多个page, page是最小的读写单元

NAND Flash布局示意图

NAND Flash布局示意图

这里我们需要重点关注的是:

  • 读写的操作对象是page,通常是512字节或者2KB
  • 擦除的对象是block,通常包含32或64个page(16KB或64KB)
  • 每个block在写入前需要先擦除
  • block擦除前,需要保证本block上所有page中都不包含有效数据(如果有些page包含有效数据,需要先搬移到其他地方)

flash的最小操作单元

flash的最小操作单元

Program/Erase Cycles

Flash还有一个重要特性:Flash不支持更新操作,严格说应该是不支持原址更新。 如果我们已经往某个page中写入了数据,想修改这个page中的内容,只能通过下面的方法:

  1. 先把本page所属block的数据全部读出来,比如先读到内存DRAM
  2. 然后修改对应page的内容
  3. 接下来擦除整个block
  4. 最后把修改后的block数据回写到Flash

Flash芯片上block的擦写次数是有限的,最大擦写次数称为PE Cycles(Program erase cycles, 往Flash写入的过程又称为编程过程,即program)。如果采用上面的方法进行原址更新,Flash很容易就会被用坏的。一个折中的方法是:将新数据写到一个新的page中,并将原来的page标记为无效,如下图所示:

说明:新的page和老的page可以位于同一个block,也可以位于不同的block,甚至位于不同的die。

flash数据更新示意图

flash数据更新示意图

这样做会带来另外的问题:

  1. 数据所在page变了,后续如何访问新的数据(谁来维护这个映射关系)
  2. 无效的page什么时候回收(上面的做法只是延迟了擦除block的时间,但是空闲page迟早有用完的时候)
  3. 如何选择新的page,保证整个flash的擦写均衡(避免有的block擦除次数多,有的block擦除次数少)

接下来登场的FTL会解决上面的问题。需要注意的是,擦除的耗时远大于读写耗时,相关逻辑处理不好的话会影响性能。所以目前有很多FTL的优化算法。

关于Flash的原址更新补充如下说明:假设一个空白page是全1,比如1111 1111,对它的写操作只能把其中的某些位由1变为0(第一次写可以把1111 1111改成1111 0000,第二次可以继续把1111 0000改成0011 0000,从这个角度看,page可以执行多次写操作),而无法再把0变为1(如果某个写操作涉及把0变为1,那就无能为力了,只有整个block擦除后再写入了)。

三、The Flash Translation Layer

逻辑地址映射

在NAND Flash出现前,逻辑地址映射(Logical Block Mapping, 简称LBA)就存在了,它是为了对上层的文件系统屏蔽Physical Block Address(PBA)的细节,让寻址更简单、灵活。

下面是逻辑地址和物理地址映射示意图:

逻辑地址和物理地址映射示意图

逻辑地址和物理地址映射示意图

上图所示属于page-to-page的映射,这种映射的缺点是FTL中维护大量的映射关系,好处是管理方便(某个page更新时,不用关心新数据是否和原数据位于同一个block,如下图所示)。

page-to-page映射时的数据更新

page-to-page映射时的数据更新

实际一般使用block-to-block的映射(这种情况下,逻辑page和物理page的映射是固定的,比如逻辑的page1对应物理的page1,逻辑的page2对应物理的page2),如下图所示:

LBA和PBA的映射

LBA和PBA的映射

block-to-block的映射,好处是维护的映射关系较少,节省了存储空间,缺点是在数据更新的时候比较麻烦,如下图所示:

  1. 步骤1展示的是初始状态,FTL的映射指向Original block
  2. 步骤2想要更新前两个page的数据:先将新数据写入新的的block(注意:page在block中的相对位置保持不变),原来block中对应的page被标记为无效
  3. 步骤3把原来block中下面的两个page搬移到新的block中(注意:page在block中的相对位置保持不变)
  4. 步骤4更新FTL映射关系,指向新的block,然后擦除原来的block(具体什么时候擦除,由Flash内部的垃圾回收机制决定)

部分page更新

部分page更新

block-to-block方式的映射,在数据更新的时候产生了额外的数据拷贝,需要付出的代价较高。为了解决这个问题,FAST、BAST等算法应运而生。

可以看到,无论是page-to-page的映射还是block-to-block的映射,虽然Flash内部的映射关系发生了变化,但是该变化对文件系统是透明的,因为FTL的映射表对外并未发生变化。

磨损均衡

每个block的最大擦写次数(P/E Cycles)基本上是一样的,磨损均衡(Wear Levelling)的作用是保证所有block被擦写的次数基本相同。这就要求磨损均衡算法要把擦写操作均摊在所有的block上。

如果所有block上的数据都经常更新,磨损均衡算法执行起来问题不大。如果有些block上存在冷数据(写入之后就很少更改的数据),我们必须根据一定的策略强制搬移这些数据并擦写对应的block,否则这些block就永远不会被擦除。当然这种操作会增加系统负载,同时也加大了整个系统的磨损(产生了不必要的擦写)。

实际上,磨损均衡算法越激进,系统的磨损越严重;但是如果磨损均衡算法太消极,会导致两极分化,部分block被擦除次数较多,部分block被擦除次数较少。

垃圾回收

接下来我们需要处理page的回收问题(Garbage Collection)。Flash的擦除单元是block,这决定了垃圾回收的最小单元也是block。block回收过程中,需要确保待擦除block上无有效数据;如果有的话,需要搬移到其他的block(和磨损均衡一样,这也会增加额外的负担,实际应用中需要找到一个平衡点)。

为什么需要垃圾回收

我们假设一个简单的存储介质只包含5个block,每个block包含10个page。在初始化状态,所有的page都是空的,存储介质的可用空间是100%。

初始化状态

初始化状态

接下来写入一些数据(注意:写入的最小单元是page)。从下图可以看出,有些page已经被占用了,并且由于磨损均衡算法的作用,他们被分散在不同的block上:

写入数据

写入数据

我们再继续写入一些数据,现在50%的空间被占用了,并且数据分散在各个block上(尽管在物理层面数据是分散在各个block的,FTL对外展现的可能是连续的):

继续写入数据

继续写入数据

如果这时更新数据,FTL会选择一个空的page写入新数据,然后把老的page标记为stale状态(黄色标记块),如下图所示:

更新数据

更新数据

这时最左边的block包含2个stale状态的page和4个used状态的page,为了回收stale状态的page,必须先把4个used状态的page拷贝到其他的block,然后再把最左边的block整个擦除掉。如果此时不执行该操作,继续写入新数据(或者更新现有数据),会耗尽所有free状态的page,尽管此时还存在stale状态的page,但是已经无法回收了(有效数据没法腾挪了),这时候整个存储介质会进入只读状态。

所以,Flash的FTL层需要执行垃圾回收策略,释放stale状态的page。

写放大因子

从上面的介绍我们了解到,磨损均衡和垃圾回收在一定程度上都会触发后台数据搬运。这些操作是在Flash内部进行的,外部通过任何方法都监控不到,外部唯一能感受到的就是性能受到影响,比如某次写很耗时。

这种现象叫做写放大(Write Amplification),可以通过下面的公式衡量。该值越大说明效率越低,会对存储介质的性能和寿命造成不良影响:

写放大因子定义

写放大因子定义

公式的分子是实际写入到Flash的数据量,分母是有效数据量。比如一次写入5KB数据,但是由于磨损均衡或者垃圾回收导致后台产生了数据搬运,实际写入数据量是10KB,那么,写放大因子就是2。

预留空间

一般情况下,存储介质的实际存储空间都大于标称空间(一般多7%左右,具体依赖生产商),多出来的存储空间被称为预留空间(Over-Provisioning),这部分空间用户是无法使用的。它可以被用来进行数据腾挪,保证垃圾回收、擦写均衡的正常进行,如果有坏块产生,还可以作为替补block顶上去(在一定程度上,让用户感知不到坏块的存在)。

预留空间

预留空间

四、参考资料

  1. https://pdfs.semanticscholar.org/faf8/22b0712731a32a10988e4ee3b3602bec5dd9.pdf
  2. https://flashdba.com/storage-for-dbas/

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

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

相关文章

什么是Flex容器和Flex项目(Flex Container and Flex Item)?它们之间有什么关系?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Flex容器和Flex项目⭐ Flex容器⭐ Flex项目⭐ 关系⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为…

CRM如何提高销售效率?三个功能实现销售自动化

销售效率对企业的盈利能力有着至关重要的联系。提高销售效率,就是要提高销售人员的工作效率和销售转化率。那么,企业如何提高销售效率呢?CRM销售自动化功能可以帮助企业实现这一目标。 一、线索管理 线索是指有潜在购买意向的客户&#xff…

山西省文物局与大势智慧签订战略合作协议

8月24日,由山西省文物局、中国文物信息咨询中心(国家文物局数据中心)主办的数字文博发展论坛在太原举行。武汉大势智慧科技有限公司(后简称“大势智慧”)受邀参与,与来自国内文博数字化领域的专家学者齐聚一堂,围绕“数…

CentOS配置Java环境报错-bash: /usr/local/jdk1.8.0_381/bin/java: 无法执行二进制文件

CentOS配置Java环境后执行java -version时报错: -bash: /usr/local/jdk1.8.0_381/bin/java: 无法执行二进制文件原因是所使用的jdk的版本和Linux内核架构匹配不上 使用以下命令查看Linux架构: [rootlocalhost ~]# cat /proc/version Linux version 3.1…

SpringBoot完整项目部署流程(软件安装-前后端部署)

SpringBoot完整项目部署流程 安装Jdk 使用XTFP工具将jdk的二进制发布包上传到Linux 解压安装包 tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local解压完毕 配置环境变量,使用vim命令修改 /etc/profile文件,在文件末尾加入如下配置 JAVA_HOME/usr…

flutter plugins插件【三】【Flutter Intl】

3、 Flutter Intl 多语言国际化 在Android Studio中菜单Tools找到flutter intl创建多语言配置。 创建后会在pubspec.yaml出现 flutter_intl:enabled: true 在工程的lib会生成l10n与generated文件夹 l10n包含 intl_en.arb intl_zn.arb 我们在intl_en.arb添加 { home: &quo…

最详细Maven下载、安装、配置教程

Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的开源项目,其主要服务于基于Java平台的项目创建,依赖管理和项目信息管理。maven是Apache的顶级项目,解释为“专家,内行”,它是一个项目管理的工具&…

小苹果他爹V5.8版本最强小苹果影视盒子增加46条内置优质单仓线路

这款软件直接使用了俊版的小苹果接口,并且许多资源似乎都是直接调用的小苹果官方资源。这样一来,小苹果的作者可能会面临版权方面的问题,而且也让更多的用户对小苹果的收费模式产生质疑。在这个信息传播如此快速的时代,开发者们应…

历史库存储成本节约至少 50% ,OceanBase数据压缩核心技术解读

“数据是二十一世纪的石油”,这个观点正在逐渐成为现实,现在我们有各种各样的 IT 系统不断地生产着数据,这些数据累积起来为我们的生产生活带来了很多便利。但在挖掘这些数据价值的同时,大量数据的存储与计算也带来了巨大的成本&a…

C# 如何将使用的Dll嵌入到.exe应用程序中?

文章目录 前言详细实操简要步骤 前言 有没有想自己开发的exe保留一点神秘,不想让他人知道软件使用了哪些dll; 又或许是客户觉得一个软件里面的dll文件太多了,能不能简单一点,直接双击.exe就可以直接运行了,别搞那么多乱七八糟的。…

Backtrader中文文档专栏订阅须知

由于CSDN新出的扣费机制过于强盗,您通过平台支付的金额只有50%是我的。针对本专栏,如果您有付费意愿,建议通过我的淘宝小店完成支付。(我已调整本专栏在CSDN上的售价) 之所以如此安排,主要是考虑到文档凝聚…

Redis 7 第四讲 数据持久化

总体 RDB 介绍 RDB 持久化以指定的时间间隔执行数据集的时间点快照 。 把某一时刻的数据和状态以文件的形式写到磁盘上,即使出现故障宕机,快照文件也不会丢失,数据的可靠性得到保证。快照文件就是RDB(Redis DataBase)文件(dump.rdb) 作用 在指定的时间间隔内将内存中的数…

springboot web开发静态资源的映射规则

前言 我们之间介绍过SpringBoot自动配置的原理,基本上是如下: xxxxAutoConfiguration:帮我们给容器中自动配置组件; xxxxProperties:配置类来封装配置文件的内容; web开发中都在org.springframework.boot.autoconfig…

数据治理-数据管理框架

DMBOK2提出的想法和概念在不同的组织中都可以应用,组织所采用的数据管理方法取决于某些关键要素,如其所处行业、所应用的数据范围、企业文化、成熟度、战略、愿景以及待解决的问题和挑战。 战略一致性模型和阿姆斯特丹模型,展示了组织管理数…

leetcode 1365. 有多少小于当前数字的数字

2023.9.2 本题直观的解法就是双层for循环暴力求解&#xff1a; 暴力解&#xff1a; class Solution { public:vector<int> smallerNumbersThanCurrent(vector<int>& nums) {vector<int> ans;for(int i0; i<nums.size(); i){int temp 0;//比当前元素…

【链表OJ 10】环形链表Ⅱ(求入环节点)

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode142. 环形链表 II 1.问题描述 2.代码思路 3.问题分析 leetcode142. 环形链…

mac帧 arp

1.分片 2.MSS max segment size 3.跨网络的本质 就是经历很多的子网或者局域网 4.将数据从A主机跨网络送到B主机的能力 IP和mac IP解决的是路径选择的问题 5.数据链路层 用于两个设备&#xff08;同一种数据链路节点&#xff09;之间进行传递 6.以太网ether 7.局域网通…

《爵士乐史》乔德.泰亚 笔记

第一章 【美国音乐的非洲化】 【乡村布鲁斯和经典布鲁斯】 布鲁斯&#xff1a;不止包括忧愁、哀痛 十二小节布鲁斯特征&#xff1a; 1.乐型&#xff08;A:主、B:属、C/D:下属&#xff09;&#xff1a;A→A→B→A→C→D→A→A 2.旋律&#xff1a;大三、小三、降七、降五 盲人…

C语言——指针基本语法

概述 内存地址 在计算机内存中&#xff0c;每个存储单元都有一个唯一的地址(内存编号)。 通俗理解&#xff0c;内存就是房间&#xff0c;地址就是门牌号 指针和指针变量 指针&#xff08;Pointer&#xff09;是一种特殊的变量类型&#xff0c;它用于存储内存地址。 指针的实…

MVC,MVP,MVVM的理解和区别

MVC MVC &#xff0c;早期的开发架构&#xff0c;在安卓里&#xff0c;用res代表V&#xff0c;activity代表Controller层&#xff0c;Model层完成数据请求&#xff0c;更新操作&#xff0c;activity完成view的绑定&#xff0c;以及业务逻辑的编写&#xff0c;更新view&#xf…