SSD基础架构与NAND IO并发问题探讨

图片

在我们的日常生活中,我们经常会遇到一些“快如闪电”的事物:比如那场突如其来的雨、那个突然出现在你眼前的前任、还有就是今天我们要聊的——固态硬盘(SSD)。

如果你是一个技术宅,或者对速度有着近乎偏执的追求,那么恭喜你,你找到了一个新朋友。这个朋友不仅快,而且非常稳定。他可以让你的游戏加载瞬间完成,让你的工作效率翻倍,甚至让你的电脑启动时间从“泡一杯咖啡”缩短到“打个哈欠”。

但你知道吗?这种神奇的速度背后,隐藏着一个复杂的结构和原理。这就是我们今天要探索的主题——SSD架构原理。我们将深入到它的内部,看看那些小小的闪存颗粒是如何变成我们手中的高速存储设备的。这就像是一次奇妙的探险,我们将一起揭开SSD神秘面纱,一探究竟!

先来看一张完整架构:SSD主要包括了与Host接口协议、控制器芯片SOC,NAND闪存,DRAM缓存。

图片

Host下发IO,到SSD内部的处理逻辑如下图。这里面核心点,IO逻辑地址LSA(或者叫LBA),到真正最后落入NAND,还有一层FTL转化为了NAND的物理地址PPN(或者叫做PBA)。

图片

FTL管理着逻辑地址和物理地址的映射关系。有时候,逻辑地址不变,对应的物理地址在不断变化。

图片

IO最后写入NAND的过程也有很多关卡:

  • 与SSD控制交互的NAND Channel,每个Channel通道有独立的NAND控制芯片。

  • 每个Channel也有多个NAND芯片,不同芯片之间又有Way的概念。

  • 每个NAND芯片,又包括了多个NAND die。

  • 每个Die再细分还有不同Plane

  • 每个Plane有很多个数据块Block

  • 每个Block再细分就有了Page,每个block会有上千个page数据页。

图片

为了提升固态硬盘(SSD)的性能,NAND相关的并发访问优化是关键因素之一,涉及NAND并发访问主要有以下几个方面:

  1. 多通道设计:现代SSD通常使用多通道架构,每个通道连接一组NAND闪存芯片。这样可以同时处理多个并行读写操作,从而提高I/O吞吐量和响应时间。

图片

  1. Way Pipeline设计:因为共享同一个channel通道,并不能完全并发执行。但NAND有erase/program/read多种操作,不同的操作响应时间也不一样,可以通过way pipeline的方式尽可能优化响应时间。这部分主要是在NAND package内部交叉执行(interleaving)

图片

  1. die间并发:当一个NAND芯片封装包含多个die时,可以在不同die之间并行地执行读写操作。这可以通过先进的控制器算法来实现,以充分利用所有可用资源。

图片

  1. Plane间并发:在NAND闪存中,一个die(晶片)通常由多个plane组成。每个plane都包含独立的地址线、数据线和控制信号,能够并行地执行读写操作。不同plane之间的共享可以提高SSD的性能和效率。目前NAND都支持multi-plane的操作。

图片

在进行数据写入数据页page时,不同的分配规则(比如Way优先、CH优先、Die优先),对性能有很大的影响。

图片

如果以Channel优先进行Page页的分配策略,结合Way、Die、Plane的组合排列,数据分布的可能组合如下:

图片

如果以Way优先进行Page页的分配策略,结合Channel、Die、Plane的组合排列,数据分布的可能组合如下:

图片

如果以Die优先进行Page页的分配策略,结合Channel、Way、Plane的组合排列,数据分布的可能组合如下:

图片

如果以Plane优先进行Page页的分配策略,结合Channel、Way、Die的组合排列,数据分布的可能组合如下:

图片

不同的page分配策略中,整体的有效利用率在43%。

图片

不同的page分配策略,在读写过程中,有80%的时间处于idle状态。

图片

SSD整体优化策略就是要低延迟,高带宽,增加NAND的并发度。

图片

声明:本文内容参考 Yonsei University Myoungsoo Jung教授团队研究比较早期成果,如果有不当之处,恭请留言指正,感谢!

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

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

相关文章

深度学习——第4.1章 深度学习的数学基础

第4章 深度学习的数学基础 目录 4.1 向量 4.2 求和符号 4.3 累乘符号 4.4 导数 4.5 偏导数 4.6 矩阵 4.7 指数函数和对数函数 注意:4.6和4.7位于4.2章 第4章 深度学习的数学基础 本章总结一下机器学习所需的数学知识,同时介绍如何在Python中使用…

Kafka 最佳实践:构建可靠、高性能的分布式消息系统

Apache Kafka 是一个强大的分布式消息系统,被广泛应用于实时数据流处理和事件驱动架构。为了充分发挥 Kafka 的优势,需要遵循一些最佳实践,确保系统在高负载下稳定运行,数据可靠传递。本文将深入探讨 Kafka 的一些最佳实践&#x…

二叉排序树的判断(二叉树的顺序存储):2022年408算法题

对于采用顺序存储方式保存的二叉树,根结点保存在SqBiTNode[0]中;当某结点保存SqBiTNode[i]中时,若有左孩子,则其值保存在SqBiTNode [2i1]中;若有右孩子,则其值保存在SqBiTNode[2i2]中;若有双亲结…

JavaScript中冷门但有用的String.raw

文章梗概 本文讲解的String.raw,作为JavaScript中的静态方法,用来获取模板字符串的原始字符串形式,需要注意的是与字符串模板搭配时候的事项。 介绍 String.raw() 静态方法是模板字符串的标签函数。它的作用类似于 Python 中的 r 前缀或 C#…

linux7安装python3.12.1教程

1.下载tar.gz包 地址:Python Release Python 3.12.1 | Python.org 2.上传包到linux服并解压 cd /home/local/ ll tar -zxvf Python-3.12.1.tgz 3.安装编译python所需环境 yum install -y gcc yum install -y zlib* yum -y install zlib-devel bzip2-devel opens…

组件之间传值

目录 1:组件中的关系 2:父向子传值 3:子组件向父组件共享数据 4:兄弟组件数据共享 1:组件中的关系 在项目中使用到的组件关系最常用两种是,父子关系,兄弟关系 例如A组件使用B组件或者C组件…

Windows 安全基础——Windows WPAD篇

Windows 安全基础——Windows WPAD篇 WPAD全称Web Proxy Auto-Discovery Protocol, 也就是Web代理自动发现协议。(这里的代理就是我们在渗透中使用BURP的时候修改的代理设置。)它的作用是让局域网浏览器自动发现内网中的代理服务器&#xff…

java接入gpt开发

前情提要 本次文章使用编译器为IDEA2020 使用GPT模型为百度旗下的千帆大模型 如果是个人用或者不流传出去,可以无脑入,因为会免费送20块钱(够用上万次) 代金卷查看 正式教程: 百度智能云控制台 (baidu.com) 按照步…

c++-定长内存池

文章目录 前言一、定长内存池 前言 一、定长内存池 我们知道申请内存使用的是malloc,malloc其实就是一个通用的申请函数,什么场景下都可以用,但是什么场景下都可以用就意味着什么场景下都不会有很高的性能,下面我们来设计一个定…

Diffusion Models: A Comprehensive Survey of Methods and Applications

摘要 扩散模型作为一个强大的新的深度生成模型系列出现,在许多应用中具有破纪录的性能,包括图像合成、视频生成和分子设计。在这项调查中,我们对迅速扩大的扩散模型的工作进行了概述,将研究分为三个关键领域:有效采样…

HCIP —— BGP 基础 (下)

BGP 的状态机 --- 建立对等体之间的TCP会话:指定建立对等体的对象 六种状态机 Idle状态 Idle 等待状态(相当于OSPF的down状态)--- 采用TCP单播建邻 Idle 状态下,启动BGP协议后必须指定建立对等体的目标之后,才能进入…

python中getattr

一、getattr的基本概念 getattr是python的一个内置函数,说白了也很简单,就是判断一个方法或者属性是否存在于一个对象中若是存在则运行这个属性或者方法。 getattr(object, name[, default])object:对象名称 name:属性或者方法名…

uniappp框架——初始化vue3项目(搭建ai项目第一步)

文章目录 ⭐前言💖 小程序系列文章 ⭐uniapp创建项目💖 初始化项目💖 uni实例生命周期💖 组件生命周期💖 页面调用💖 页面通讯💖 路由 ⭐搭建首页⭐form表单校验页面⭐总结⭐结束 ⭐前言 大家好…

6.题目:编号2490 小蓝的括号串1

题目: ### 这道题主要考察stack #include<bits/stdc.h> using namespace std; const int N105; stack<char> stk; char s[N]; int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n;cin>>n;cin>>s1;bool anstrue;for(int i1;i<n;i){…

Verilog基础:$random系统函数的使用

相关阅读 Verilog基础​编辑https://blog.csdn.net/weixin_45791458/category_12263729.html $random系统函数语法的BNF范式如下所示&#xff0c;有关BNF范式相关内容&#xff0c;可以浏览以往文章Verilog基础&#xff1a;巴科斯范式(BNF)。 $random系统函数在每次调用时返回一…

第四节JavaScript 条件语句、循环语句、break与continue语句

一、JavaScript条件语句 在通常的代码中&#xff0c;我们有一些需要决定执行不同动作&#xff0c;这就可以在代码中使用条件语句来完成。 下面是我们常使用的条件语句&#xff1a; if语句&#xff1a;只有当指定条件是true时&#xff0c;执行条件内代码。if…else语句&#…

【Unity动画】什么是任意状态(Any state)

&#xff08;Any state&#xff09;可以从某个状态A直接切换到另一个状态 B\C\D\E\F 比如A到C的过渡&#xff0c;直接设置从Any state 到C的过渡线触发参数即可。而不需要让A到C直接在连接&#xff0c;同样&#xff0c;B到C之间也无需直接链接。 这样设计是在每一个动画之间都…

Redis 持久化 —— 超详细操作演示!

四、Redis 持久化 四、Redis 持久化4.1 持久化基本原理4.2 RDB持久化4.3 AOF持久化4.4 RDB与AOF对比4.5 持久化技术转型 五、Redis 主从集群六、Redis 分布式系统七、Redis 缓存八、Lua脚本详解九、分布式锁 数据库系列文章&#xff1a; 关系型数据库: MySQL —— 基础语法大全…

kotlin - ViewBinding

前言 为什么用ViewBinding&#xff0c;而不用findViewById()&#xff0c;这个有很多优秀的博主都做了讲解&#xff0c;就不再列出了。 可参考下列博主的文章&#xff1a; kotlin ViewBinding的使用 文章里也给出了如何在gradle中做出相应的配置。 &#xff08;我建议先看这位博…

windows 10多用户同时远程登陆配置【笔记】

系统环境&多用户访问情况&#xff1a; 1、【win】【R】键入【gpedit.msc】 2、依次选择【计算机配置】→ 【管理模板】 → 【Windows组件】 → 【远程桌面服务】 → 【远程桌面会话主机】 →【连接】 2.1、右键 【允许用户通过使用远程桌面服务进行远程连接】 编辑 …