闪存学习_1:Flash-Aware Computing from Jihong Kim
闪存学习_1:Flash-Aware Computing from Jihong Kim
- 前言
- 一、Storage Media:NAND Flash Memory
- 1、概念
- 2、编程和擦除操作
- 3、读操作
- 4、异地更新操作(Out-Place Update)
- 5、数据可靠性
- 6、闪存控制器(SSD主控)
- 7、闪存转换层(Flash Translation Layer,FTL)
- 8、Trim/unmap命令
- 8、Scatter-Gather
- 二、总结
- reference
前言
今天主要根据Jihong Kim老师的闪存教程进行学习,帮助我更好地扎实闪存的基础知识
一、Storage Media:NAND Flash Memory
1、概念
闪存是非易失性存储芯片,具备电擦除和再编程的特性

闪存块是一个阵列,每一行为一个页(page),编程和读操作均是以页为单位,擦除是以块为单位。

2、编程和擦除操作
闪存采用的是浮栅晶体管架构,通过在控制极(Control Gate)施加电压,往浮栅(Floating Gate)注入电子,实现编程操作,表示数据0。通过在衬底施加电压,将浮栅中存储的电子吸出,实现擦除操作,表示数据1。



3、读操作
通过施加一个介于擦除状态和编程状态之间的电压值,观察晶体管是否导通,实现读操作。

如下图所示,闪存中包含寄存器作为输入和输出数据的缓冲区,当执行读操作时,实际是将指定闪存页中的数据读取到寄存器中,再从寄存器通过IO总线读取到闪存控制器中。编程操作同理,执行编程操作时,实际是先将缓存中的数据存储到闪存的寄存器中,再从寄存器编程到指定闪存页。这个寄存器可以实现多个plane并行读写的功能,提升闪存并行性。

4、异地更新操作(Out-Place Update)
闪存具备写前擦除的特性,因此当要对某页已经保存在NAND Flash中的数据进行修改更新时,需要执行异地更新,即将原先位置的数据置为无效,再将新修改的数据编程到新的闪存页中。但是由于编程和擦除操作都需要对闪存单元施加较高的电压值,容易导致闪存单元磨损,出现漏电现象,从而导致数据错误。虽然可以通过闪存控制器中的ECC进行数据纠错保证数据正确率,但ECC的纠错能力有限,当数据误码率超过ECC纠错范围时,则数据永久丢失,即该闪存单元完全损坏。因此NAND Flash具有一定的生命周期。
5、数据可靠性
数据可靠性不仅受上面提及的擦除和编程操作的影响,主要包括以下几个因素:
- 编程和擦除次数
- 闪存所处的温度
- 读次数
- 闪存的制作工艺
而对于保证数据可靠性的解决方案就是通过闪存控制器将数据迁移到新的位置,类似于刷新操作
6、闪存控制器(SSD主控)
&emsps;SSD主要由三部分组成,闪存控制器(主控)、固件和闪存。其中主控负责控制固件的运行,固件则对前后端数据进行处理,包括ECC、垃圾回收、磨损均衡、内存映射、坏块管理等,闪存控制器的出现为不完美的闪存芯片提供了更强的鲁棒性(robust)和可靠性,其与固件的结合形成了SSD控制器架构,主要由以下几个部分组成:
- 主机接口(Host Interface):这个接口通过相关协议实现主机端和SSD的交互,从而实现主机进行闪存访问操作和闪存控制器直接内存访问(DMA)。常用的接口包括SAS、SATA和PCIe。
- 闪存总线接口:总线连接闪存控制器和闪存芯片,这个总线往往包含多个channel通道,每个channel通道连接多个闪存芯片,提升闪存读写的并行性。
- 直接内存访问(Direct Memory Access,DMA)和直接闪存访问(Direct Flash Access, DFA):这两个缓冲区通过允许在没有CPU干预的情况下从内存(RAM)和闪存传输数据来提高CPU效率。
- ECC(错误检验和校对):这是一个关键的组件,可以对闪存中出错的数据进行校验,提升数据可靠性。对于高密度SSD更是不可或缺的组件。
- 其他组件:数据加密(Data Encryption)、数据扰码器(Data Scrambler)、缓存(SRAM)
下面几张图是闪存控制器在SSD中的位置分布



一个闪存控制器连接到多个闪存通道(Channel),与闪存芯片进行交互。每个闪存通道都有自己的时钟频率,MT/s额定值(Million Transfer Per Second,每秒百万次数据传输,是以数据为单位)根据DDR进行配置。通道数量越多,SSD性能越好,但对于闪存控制器的要求就更高。

7、闪存转换层(Flash Translation Layer,FTL)
通过闪存转换层实现闪存的地址映射、垃圾回收和磨损均衡操作

- 地址映射:由于闪存不能就地更新,当需要对数据进行修改更新时只能执行异地更新操作,因此FTL需要进行地址映射,将原先数据存储位置置为无效,再将新的存储位置更新到映射表中,使得后续可以通过映射表正确获取到数据的最新状态
- 垃圾回收:由于闪存具备写前擦除的特性,并且擦除操作是以块为单位的,因此,当闪存空闲空间不足时,会触发垃圾回收(Gabage Collection),则FTL就需要挑选一个受害块(victim block)执行擦除,执行有效数据的迁移,再执行受害块的擦除,更新映射表
- 磨损均衡:上面提到了当闪存单元频繁执行编程和擦除操作时会导致闪存单元彻底损坏,因此为了避免这个问题,FTL通过磨损均衡算法监测每个闪存块执行的编程和擦除次数,将热数据迁移到磨损较轻的闪存单元中,将冷数据迁移到磨损较重的闪存单元中,平衡热块和冷块的磨损程度。
8、Trim/unmap命令
Trim是内置于ATA命令中的SSD命令,对应的SCSI命令是Unmap,是磁盘与计算机交互方式的一部分。当我们在操作系统中删除一个文件时,系统为了避免影响后续请求的执行性能,没有立即向驱动器发送信号以直接在SSD擦除这些数据,而是在内存中将这些数据占用的地址标记为空,但SSD本身并不知道那些地址对应的数据已经无效。因此,操作系统通过间歇发送TRIM命令到SSD,使SSD知道对应哪些物理地址无效,从而方便SSD执行垃圾回收时对受害块(victim block)的选择,以及可以实现在后台对受害块进行预删除使其可以直接被写入。既提升SSD性能,也能降低垃圾回收的开销,延长SSD寿命。
8、Scatter-Gather
通过scatter-gather 可以提升数据的传输速率。传统的DMA一个命令只能传输物理上连续的一个块的数据,完成传输后发起中断。而采用了scatter-gather之后,通过用一个链表记录每个物理上不连续的数据块的首地址和长度,从而允许一个DMA命令一次传输多个物理上不连续的块,完成后发起一起中断,从而极大程度降低了发起中断的次数,提升了数据传输效率。
二、总结
这是今天对闪存的学习成果,各种参考资料也都放在下面了。如果有什么不对的地方,欢迎大家批评指正!
reference
1.https://drive.google.com/file/d/1Umrlua-gX3deXkR9yZOAMq1A6nPIaxLF/view
2.https://semiengineering.com/four-steps-to-verifying-an-ssd-controller-with-emulation/
3.https://www.delkin.com/blog/understanding-nand-flash-based-ssd-drives-and-the-flash-controller/
4.https://blog.csdn.net/lanseliuxing/article/details/135359240
5.https://blog.csdn.net/wylfengyujiancheng/article/details/120435464
6.https://www.crucial.cn/articles/about-ssd/what-can-trim-do
7.https://blog.51cto.com/xmwang/1678350
8.https://blog.csdn.net/lichengtongxiazai/article/details/40398711
相关文章:
闪存学习_1:Flash-Aware Computing from Jihong Kim
闪存学习_1:Flash-Aware Computing from Jihong Kim 前言一、Storage Media:NAND Flash Memory1、概念2、编程和擦除操作3、读操作4、异地更新操作(Out-Place Update)5、数据可靠性6、闪存控制器(SSD主控)7…...
如何将本地项目上传至Gitee仓库(详细教程)
前提条件 1、本地电脑安装Git客户端 2、本地已有项目 3、Gitee注册好了账户 如果没有安装Gitee 可以区菜鸟查看一下安装教程 Git教程https://www.runoob.com/git/git-tutorial.html 操作示例 前提条件已经准备好的情况下登录gitee 码云 https://gitee.com 点解右侧加号 新…...
redis详细教程(3.hash和set类型)
hash Redis中的Hash是一种数据结构,用于存储键值对集合。在Redis中,Hash非常适合表示对象,其中对象的每个字段都对应一个键值对。以下是关于Redis中Hash的详细讲解: 特点: 1. 键值对集合:Hash是一个包含…...
性能测试详解
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始,到客户端接收到最后一个字节数据为止所消耗的时间。响应时间按软件的特点…...
修改ruoyi的logo和标题
1、修改网页标签上的图标和标题 静态修改 标签页上的 图标 直接替换public/favicon.ico文件为你自己的图标文件 如果你的图标文件名不是favicon.ico,你还需要在public/index.html中相应地修改这一行,将/favicon.ico替换为你的图标文件路径。 静态修改…...
vue系列==vue3新语法
vue系列vue3新语法 1、setup组合式API入口函数 2、利用ref函数定义响应式数据 3、利用reactive函数定义响应式数据 1、setup组合式API入口函数 1、Vue3为组合式API提供了一个setup函数,所有组合式API函数都是在此函数中调用的,它是组合式API的使用入口…...
001-Kotlin界面开发之Jetpack Compose Desktop学习路径
Compose Desktop学习之路 学习过程 理解Kotlin的基本语法 Compose Desktop采用Kotlin构建,因此对Kotlin的基本语法有很好的理解是必不可少的。你可以从官方的Kotlin文档开始。 用一句话概括,Kotlin是一种现代的、静态类型的编程语言,它结合…...
qt QStackedLayout详解
QStackedLayout类提供了一种布局方式,使得在同一时间内只有一个子部件(或称为页面)是可见的。这些子部件被维护在一个堆栈中,用户可以通过切换来显示不同的子部件,适合用在需要动态显示不同界面的场景,如向…...
python实现钉钉群机器人消息通知(消息卡片)
直接上代码 python """ 飞书群机器人发送通知 """ import time import urllib3 import datetimeurllib3.disable_warnings()class DingTalkRobotAlert():def __init__(self):self.webhook webhook_urlself.headers {Content-Type: applicatio…...
防火墙技术应用
目录 防火墙安全功能指标防火墙性能指标防火墙部署防火墙应用案例-Linux防火墙防火墙应用案例-华为包过滤防火墙ACL(基本)防火墙应用案例-工控防火墙部署 防火墙安全功能指标 我们防火墙也会提供各种各样的互联接口,它这种接口有以太网、快速以太网、千兆以太网&am…...
docker engine stopped
1)环境:win 10 2)docker安装时已经已经安装了虚拟机 3)启用网络适配器 4)启用docker服务(依赖服务LanmanServer) 5)全都弄好了,docker还是打不开,没办法了&a…...
Redis- 内核的分配内存限制的警告“WARNING Memory overcommit must be enabled!”
文章目录 问题描述报错原因影响解决方案注意事项 问题描述 [rootredisxxx]# redis-sentinel ./sentinel.conf 19638:X 01 Nov 2024 16:57:27.180 # WARNING Memory overcommit must be enabled! Without it, background save or replication may fail under low memory condi…...
腾讯云在线扩容数据盘
文章目录 一、查询云硬盘使用的分区形式二、根据不同的云硬盘类型进行在线扩容分区2.1 安装 gdisk 工具。2.2 安装 growpart 工具使用 growpart 工具扩容分区 三、根据不同的云硬盘类型进行在线扩容文件系统3.1 扩容 EXT 文件系统3.2 扩容 XFS 文件系统 一、查询云硬盘使用的分…...
Time Travel Queries|在 RisingWave 中访问历史数据
对于许多组织来说,能够访问历史数据十分关键。以金融交易公司为例: 特定时间点的数据快照与合规审查、审计流程息息相关。企业的关键业务系统也依赖历史数据来恢复故障并重建系统。分析过去事件及其对当前状况的影响,还有助于准确预测并制定…...
Unity之UnityWebRequest
复习UnityWebRequest 介绍下载文件和上传文件下载进度和异常验证文件DownloadHandlerScript 介绍 unity中使用UnityWebRequest来代替所有HTTP请求提供了三种API,UnityWebRequest.Get,UnityWebRequest.Post,UnityWebRequest.Put分别处理GET,POST,PUT请求…...
使用 pkg 打包 Puppeteer 应用:跨平台自动化的轻量级选择
使用 pkg 打包 Puppeteer 应用 pkg 是一个非常强大的工具,它允许你将 Node.js 项目打包成独立的可执行文件,这意味着你可以在没有安装 Node.js 环境的设备上运行该应用。这对于希望分发不暴露源代码的应用程序、创建跨平台的快速演示版本或简化部署流程…...
【Flask】三、Flask 常见项目架构
目录 前言 简单项目结构 中型项目结构 复杂项目结构 前言 Flask是一个轻量级的Web应用框架,它被广泛用于快速开发简单的网站和复杂的大型应用。随着项目规模的增长,合理的项目架构变得尤为重要。这里探讨Flask项目中的三种常见架构&…...
AI机西使用体验:你不知道的强大功能揭秘!
AI机西有人用过吗?用户体验和功能详解 最近我听说了很多关于AI机西的讨论,很多人都在问:这款工具好用吗?有没有人用过?今天我就从我的使用体验出发,给大家分享一下AI机西的功能和我的感受。 1. 绘画功能&a…...
什么是护网(HVV)需要什么技术?(内附护网超全资料包)
文章目录 一、什么是护网行动?二、护网分类三、护网的时间四、护网的影响五、护网的规则六、什么是红队? 6.1、红队测试的意义 七、什么是蓝队 一、什么是护网行动? 护网行动是以公安部牵头的,用以评估企事业单位的网络安全的…...
opencv优秀文章集合
文章目录 一、 CV领域1.1 图像处理1.2 目标检测与识别1.3 图像分割、目标追踪1.4 姿态估计1.5 3D视觉1.6 图像生成1.7 机器视觉1.8 其它 二、 nlp三、语音四、推荐系统 《OpenCV优秀文章集合》《OpenCV系列课程一:图像处理入门(读写、拆分合并、变换、注…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
