NVME-SQ、CQ & DoorBell

参考资料:《深入浅出SSD》 , NVME协议1.3

SQ和CQ

全称Submission/Completion Queue

1.主机往SQ中写入命令,SSD往CQ中写入命令执行的结果

2.SQ和CQ有两种,

  一种是Admin,用来放Admin命令,用以主机管理控制SSD

  一种是IO,用来放IO命令,用以主机与SSD之间传输数据

3.SQ和CQ可以是一对一的关系,也可以是多对一的关系,它们是成对的

4.系统中只有一对Admin SQ/CQ,它们是一 一对应关系,IO SQ/CQ却可以有很多(最多为65536,即64k-1)

5.IO SQ/CQ不是一生下来就有的,它们需要通过Admin命令创建

6.主机端每个CPU只有一个CQ(主机端只能有一对Admin SQ/CQ,为一 一对应关系;每个CPU最多可以有一个IO CQ,但是可以有多个SQ)

 可以有一个或多个SQ(多个SQ可以用来赋予不同的优先级)

 实际系统中需要多少SQ, 取决于系统配置和性能需求,可灵活设置IO SQ

7.SQ和CQ都有一定的深度,对Admin SQ/CQ来说,其深度可以是2 ~ 4096(4K)

 对IO SQ/CQ来说,其深度可以是2 ~ 65536(64K),队列深度是可以配置的(SQ和CQ的个数也是可以配置的)

NVME的性能可以通过配置队列个数和队列深度来灵活调节的

8.每个SQ放入的是 命令条目,无论是Admin还是IO命令 ,每个命令条目大小都是64字节 ,

每个CQ放入的是命令完成信息的条目,每个条目大小是16字节

Queue

1. 队列要素

1)队列深度

2)队列内容

3)队列头部

队列头部的那个正在被服务或等待被服务,完成后将离开队伍

头部决定谁先被服务

4)队列尾部

尾部决定新来队列的站位

2.队列的生产者消费者模型

简述:如下图,生产者往队列的尾部写入东西,消费者从队列的头部取出东西

1)对SQ来说,主机是它的生产者(主机向SQ的尾部写入指令),SSD是它的消费者(SSD从SQ的头部取出指令执行)

2)对CQ来说,SSD是它的生产者(SSD向CQ的尾部写入命令的执行结果),主机是它的消费者(主机从CQ的头部读取命令的执行结果)

DoorBell

1.DoorBell是SSD控制器端的寄存器,记录SQ和CQ的头部和尾部

2.每个SQ或CQ都有两个对应的DoorBell,即Head DoorBell和Tail DoorBell

3.主机只能写DoorBell,不能读DoorBell

4.主机通过SSD往CQ中写入的命令完成状态获取其队列头部或者尾部

案例

下面我们以一个案例来说明SQ, CQ和DoorBell之间的联系

1.一开始,假设SQ1和CQ1都是空的,Head=Tail=0,如图

2.Host往SQ1写入三条指令,SQ的Tail变成3,Host写SQ1 Tail DoorBell(值为3),通知SSD控制器取指令,如图

3.SSD控制器收到通知,取回SQ1中的3条指令

4.SSD开始执行指令,SSD把SQ1中的3条指令都消费了,SQ1的Head变成3,Host写SQ1 Head DoorBell(为Head值3),如图

5.SSD执行完成两条指令,SSD往CQ1中写入两条指令完成的信息,SSD写CQ1 Tail DoorBell(值为2)

6.SSD生成中断,通知Host有命令完成,如图

7.Host收到通知,从CQ1中取出两条命令的完成信息,开始处理,CQ1中的两条命令完成信息都消费了,CQ1的Head变为2

8.处理完毕,Host写CQ1 Head DoorBell(为CQ1的Head值2),如图

NVME-SQ、CQ DoorBell相关推荐

  1. QQ机器人思路理解(C++、CQ)

    近期看着教程写了一下基于C++.CQ下的qq机器人,就是在CQ的主框架上来实现qq的自动检索并回复的功能.就是这样已经把主框架都给出来的前提下,依然还是困难重重. 首先,qq机器人利用CQ框架下的内用 ...

  2. SATA、mSATA、M.2、M.2(NVMe)、PCIE固态硬盘接口详解

    固态硬盘 概念 固态驱动器(Solid State Drive),俗称固态硬盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘,因为台湾英语里把固体电容称之为Solid而得名.SSD由控制单元和存储单元 ...

  3. AHCI协议、NVME协议、SATA总线、PCIe总线、SATA接口、PCIe接口、M.2接口

    内容来自 硬件茶谈 硬盘的SATA M.2 NGFF NVME是什么意思,详解硬盘的总线协议与接口 侵删. 一.协议 AHCI和NVME协议民用很多,而SCSI协议大多用在服务器上. 二.总线   总 ...

  4. 2.3 黑群晖驱动:开启nvme缓存、将nvme缓存作为存储盘 教程

    黑群晖驱动安装工具下载: 链接:https://pan.baidu.com/s/1CMLl6waOuW-Ys2gKZx7Jgg?pwd=chct 提取码:chct 一.开启NVME缓存 在群辉-> ...

  5. SSD硬盘的接口区别详解图解 SATA、mSATA、PCI-E、M.2(NVMe协议) 、U.2、Type-c、USB、Macbook接口

    转 扫盲:SATA.mSATA .PCIe和M.2--SSD硬盘的接口 2019年03月02日 20:47:06 nedwons 阅读数 11035更多 个人分类: 非技术 SATAT通道:硬盘--内 ...

  6. [SSD科普之2] SATA、mSATA、M.2、M.2(NVMe)、PCIE固态硬盘接口详解

    固态硬盘 概念 固态驱动器(Solid State Drive),俗称固态硬盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘,因为台湾英语里把固体电容称之为Solid而得名.SSD由控制单元和存储单元 ...

  7. SATA、mSATA、M.2、M.2(NVMe)、PCIE固态硬盘接口如何区分

    概念 固态驱动器(Solid State Drive),俗称固态硬盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘,因为台湾英语里把固体电容称之为Solid而得名.SSD由控制单元和存储单元(FLAS ...

  8. 【读书笔记】深入浅出SSD

    本篇文章大部分都是转载,少部分内容为个人补充,作为存储行业SSD部分入门很有帮助. 转载自 https://www.cnblogs.com/lmhyhblog/p/12508849.html ,辛苦作 ...

  9. 固态硬盘:NVME 命令队列 SQ/CQ 的奥秘

    文章目录 前言 1. SQ 和 CQ 是什么? 2. SQ/CQ 有多少? 3. SQ/CQ 如何更新 4. SQ/CQ 执行流程 主机和SSD如何同步队列信息? 队列优先级 总结 前言 NVMe(o ...

最新文章

  1. 在Win10下如何实现VS下工程代码的开机自启功能
  2. 如何判断Android手机当前是否联网
  3. CentOS6.0搭建DNS
  4. cmd命令生成webservice_使用wsimport命令生成webService客户端代码实例
  5. 基于 OData 模型和 JSON 模型的 SAP UI5 表格控件行项目的添加和删除实现
  6. 计算机汉字的输入和编辑教案,计算机汉字录入教案
  7. UnityShader1:渲染流水线
  8. oracle 常用索引分析,使用原则和注意事项
  9. 用Node编写RESTful API接口
  10. 在UOS(deepin)系统下安装CPUS-PDF虚拟PDF打印机的方法
  11. 分节符、分页符及页眉设置方法
  12. Vue项目:style样式篇
  13. Elasticsearch:在华为大数据集群 从c80升级至651版本后,执行es命令修改配置失败
  14. Ubuntu 18.04 安装vsftpd
  15. python打印古诗_python教程:利用python基础知识取出对应诗句
  16. django-模板语言-verbatim标签-不使用DTL的解析
  17. Java程序在内存中运行详解
  18. 全志A40i移植 RTL8188FTV/RTL8188FU USB-WiFi
  19. nrf52832 学习笔记(三)蓝牙从机广播
  20. 北邮计院数电第五章——VHDL语言

热门文章

  1. 2016-12-26 菜鸟上路(4)——VS中关于MFC界面设计
  2. [C/C++/Qt] 网易云音乐缓存文件批量自动解析解码工具 - CloudMusicCache2Mp3(开源)(Version:1.0)
  3. 常用的四种sql增删改查
  4. 大新闻!微软正考虑添加 Python 为官方的 Excel 脚本语言
  5. CentOS7 安装 X Window System
  6. networkx计算边的重要性:边介数或者中介中心性edge_betweenness
  7. Eclipse中离线安装ADT插件详细教程及下载链接
  8. 炫技:拼接列表、破碎二维数组——Python sum()函数隐藏技能花式玩法
  9. FlexHex分析MP4格式的文件
  10. `英语` 2022/8/25