【SGL】Scatter-Gather List内存传输技术
文章目录
- 1. What is SGL?
- 2. sgl内存传输的原理
- 2.1 核心思想
- 2.2 sgl数据结构
- 2.3 摘链和挂链
- 3. 零拷贝技术
- 3.1 问题背景
- 3.2 零拷贝的核心思想及实现方式
- 4. sgl在存储行业的应用
1. What is SGL?
sgl(Scatter-Gather List)内存传输技术,是一种高效管理非连续内存数据传输的方法。
核心思想:通过一个链表或数组描述多个分散的内存块,使得硬件可以一次性完成对这些非连续内存区域的读写操作,无需CPU介入数据拷贝。
2. sgl内存传输的原理
2.1 核心思想
主要聚焦在分散、聚集、零拷贝上:
- 分散-聚集 Scatter-Gather
- 分散:将数据从一块连续缓存区拆分为多个块,写入多个非连续的内存区域;
- 聚集:从多个非连续的内存区域读取数据,合并为一块连续的流。
- 零拷贝 zero-copy
- 零拷贝是避免数据在内存中的多次拷贝(如用户态和内核态之间、内核与设备之间),直接通过内存地址描述符完成传输。
2.2 sgl数据结构
以sgl链表为例,每个条目(Entery)包含的内容:
- 内存块的物理地址
- 内存块的长度
- 指向下一个节点的指针
整体结构:通常以链表或数组的形式组织多个条目,比如:
sgl entry1 : 地址0x1000,长度512B,指向entry2的指针
sgl entry2 : 地址0x2000,长度1024B,指向entry3的指针
sgl entry3 : 地址0x3000,长度256B,NULL
2.3 摘链和挂链
摘链是从SGL链表中移除一个或多个节点的操作,通常用于以下场景:
- 传输完成:当某个节点对应的内存数据传输完成后,释放该节点资源;
- 错误处理:传输过程中发生错误,需要中断并清理部分已经处理的节点;
- 动态调整:根据传输进度动态缩减SGL链表的规模
挂链是将新的节点添加到SGL链表中的操作,通常用于以下场景:
- 动态扩展传输:传输过程中需要追加新的内存块;
- 预构建SGL:初始化时逐步添加多个内存块节点;
- 错误恢复:重传时需要重新挂载节点
挂链和摘链也伴随着加减计数:
- 加计数:新增SGL条目、或扩展传输范围时,进行加计数;
- 减计数:完成条目传输、释放资源时,进行减计数。用于标记已经传输的数据块,释放内存或复用缓冲区,避免资源泄露
3. 零拷贝技术
零拷贝zero-copy技术,是一种优化数据传输效率的方法,旨在消除或减少数据在内存中的冗余拷贝操作,从而降低CPU开销、节省内存带宽并减少延迟。该技术广泛应用于网络通信、文件传输、存储系统和高性能计算等领域。
3.1 问题背景
传统数据传输存在的问题:
例如从文件读取数据并通过网络发送:
- 文件数据从磁盘读取到内核缓冲区(page cache);
- 数据从内核缓冲区拷贝到用户态缓存区(应用层内存);
- 数据从用户态缓冲区再拷贝到内核的网络缓冲区(socket buffer);
- 最后通过网卡发送数据。
该方式存在的问题:
- 多次数据拷贝:数据在内核态和用户态之间来回复制;
- cpu开销高:cpu需要参与数据搬运,占用大量计算资源;
- 内存带宽浪费:冗余拷贝消耗内存带宽,影响系统整体性能。
3.2 零拷贝的核心思想及实现方式
零拷贝技术,通过绕过用户态,直接在内核态或硬件设备间传输数据,减少甚至消除数据拷贝次数。
零拷贝的实现方式,大概有:
- 内存映射 Memory Mapping,mmap
- 原理:将文件直接映射到用户态进程的虚拟内存空间,进程通过指针直接读写文件,无需通过
read()/write()
系统调用 - 实现流程:调用
mmap()
将文件映射到用户空间;进程直接操作映射的内存区域,修改会自动同步到文件。
- 原理:将文件直接映射到用户态进程的虚拟内存空间,进程通过指针直接读写文件,无需通过
- sendfile()系统调用
- 原理:直接在两个文件描述符(如文件到socket)之间传输数据,全程在内核态完成
- 实现流程(以Linux为例):调用
sendfile()
;数据从文件的page cache直接拷贝到socket缓冲区;网卡通过DMA从socket缓冲区读取数据发送
- 硬件辅助的零拷贝
- 原理:结合DMA控制器和SGL,设备直接访问多个非连续内存块,无需CPU拷贝
- 实现流程:构建SGL描述数据的内存地址和长度;网卡或磁盘控制器通过DMA按SGL直接读写内存
4. sgl在存储行业的应用
以分布式存储与对象存储为例,对象存储系统需要将大对象拆分为多个分片存储在不同节点:将对象分片的存储节点地址和偏移量写入sgl,客户端或服务端通过sgl并发读写多个分片。
再例如,文件数据在内存中可能分散在多个page cache页(例如大文件被拆分为多个4KB页):文件系统将文件的page cache页地址构建为sgl,存储设备通过sgl直接读取这些页,无需合并到连续内存。
sgl内存传输技术通过消除数据拷贝、直接操作非连续内存块,成为存储行业高性能I/O的核心技术
相关文章:
【SGL】Scatter-Gather List内存传输技术
文章目录 1. What is SGL?2. sgl内存传输的原理2.1 核心思想2.2 sgl数据结构2.3 摘链和挂链 3. 零拷贝技术3.1 问题背景3.2 零拷贝的核心思想及实现方式 4. sgl在存储行业的应用 1. What is SGL? sgl(Scatter-Gather List)内存传…...

-MAC桢-
MAC桢和IP的关系: 主机A想跨网络和B通信需要IP地址进行路由选择,但一个局域网,比如路由器进行路由选择之前,首先要将数据包发送给路由器B,也就是局域网通信也就是同一个网段的主机进行通信,所以必须通过mac…...

安装:Kali2025+Docker
安装:Kali2025Docker Kali2025安装 直接官网下载WMware版本 https://www.kali.org/get-kali/#kali-virtual-machines 直接打开运行 初始用户密码 kali/kali sudo -i 命令切换到root 更换镜像 切换到其他可用的 Kali Linux 镜像源可能会解决问题,可以使用国内的镜像源&…...

Linux云计算训练营笔记day04[Rocky Linux中的命令:mv、cp、grep(^$)、tar、重定向>和>>]
mv 移动(剪切) 源数据会消失 格式: mv 源文件 目标路径 touch /opt/a.txt 创建文件 mv /opt/a.txt /root 移动文件,没有改名 mkdir gongli 创建目录 mv gongli /opt/ 移动目录,没有改名 mv /opt/gongli tedu 移动目录,改名了 …...

AbMole Olaparib:打破常规,用PARP抑制重塑肿瘤研究
在当今的生物医学研究领域,Olaparib(AZD2281,AbMole,M1664)作为一种重要的PARP(聚腺苷二磷酸核糖聚合酶)抑制剂,受到了广泛关注。Olaparib可干扰 DNA 单链断裂的修复,从而…...
RPC、gRPC和HTTP的区别
RPC 只是一种屏蔽远程过程调用的设计,它与HTTP不是对立的,两者不是一个层面的概念。 RPC底层通信可以使用TCP实现(如Thrift),也可以使用HTTP实现(如gRPC),其本身并无限制。 1. 概念…...

Windows重置网络,刷新缓存
同时按键盘上的【Windows】键和【S】键,弹出搜索框,输入 命令提示符 在“最佳匹配”下的【命令提示符】上右键,点击【以管理员身份运行】 1弹出一个窗口,在光标闪烁的位置,直接输入【netsh winsock reset】࿰…...
Ref是什么
在 React 中,ref 是一种用于访问 DOM 元素或组件实例的机制。它允许你在组件中直接操作 DOM 元素,或者访问子组件的实例。ref 的使用场景非常广泛,包括表单操作、焦点控制、动画等。以下是关于 ref 的详细讲解以及在项目中的常见使用场景。 …...

OpenHarmony平台驱动开发(十),MMC
OpenHarmony平台驱动开发(十) MMC 概述 功能简介 MMC(MultiMedia Card)即多媒体卡,是一种用于固态非易失性存储的小体积大容量的快闪存储卡。 MMC后续泛指一个接口协定(一种卡式)࿰…...

解决IDEA无法运行git的问题
之前git一直没有问题,今天打开就提示我安装git,自然用git去提交新项目也会遇到问题。 我出现问题的原因是:git路径缺失 文件->设置->git 发现git的路径为空,按照实际位置填写即可...

HTTP 响应状态码总结
一、引言 HTTP 响应状态码是超文本传输协议(HTTP)中服务器对客户端(通常是 Web 浏览器)请求的响应指示。这些状态码是三位数字代码,用于告知客户端请求的结果,包括请求是否成功。响应被分为五个类别&#…...
Java求职面试:Spring Boot与微服务的幽默探讨
Java求职者面试:技术与幽默的碰撞 场景概述 在某互联网大厂的面试现场,面试官严肃认真,程序员则是一个搞笑的水货角色。面试者名叫张伟,年龄28岁,硕士学历,拥有5年的Java开发经验。以下是面试的详细过程。…...
lua脚本+Redission实现分布式锁
实现分布式锁最简单的一种方式:基于Redis 不论是本地锁还是分布式锁,核心都在于“互斥”。 在 Redis 中, SETNX 命令是可以帮助我们实现互斥。SETNX 即 set if not exists (对应 Java 中的 setIfAbsent 方法),如果 key 不存在的…...
JVM之jcmd命令详解
jcmd 是 Oracle JDK(Java Development Kit)自 JDK 7 起引入的一个强大的诊断工具,用于与正在运行的 JVM(Java Virtual Machine)实例进行交互。它允许用户执行各种诊断命令,比如线程堆栈分析、堆转储、GC 信…...
Go语言:json 作用和语法
在 Go 语言中,JSON 字段(也称为 JSON Tag)是附加在结构体字段上的元数据,用于控制该字段在 JSON 编码(序列化)和解码(反序列化) 时的行为。它的语法是: type StructName…...
Hive HA配置高可用
Hive的高可用性(HA)通过消除关键组件的单点故障来实现,确保系统在部分故障时仍能正常运行。其基本原理涉及以下核心组件和策略: 1. Hive Metastore 的高可用 多实例部署:部署多个Metastore服务实例,每个实例连接到共享的后端数据库(如MySQL、PostgreSQ…...
Ubuntu 第11章 网络管理_常用的网络配置命令
为了管理网络,Linux提供了许多非常有用的网络管理命令。利用这些命令,一方面可以有效地管理网络,另一方面出现网络故障时,可以快速进行诊断。本节将对Ubuntu提供的网络管理命令进行介绍。 11.2.1 ifconfig命令 关于ifconfig命令&…...

【Qt】Qt 构建系统详解:qmake 入门到项目实战
Qt 构建系统详解:qmake 入门到项目实战 本文将系统介绍 Qt 构建工具 qmake 的用法,并通过一个完整的项目结构示例,帮助你掌握 .pro 文件编写、子项目管理、模块依赖等核心技能。 🧭 一、什么是 qmake? qmake 是 Qt 提…...
Python实例题:pygame开发打飞机游戏
目录 Python实例题 题目 pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本 代码解释 初始化部分: 游戏主循环: 退出部分: 运行思路 注意事项 Python实例题 题目 pygame开发打飞机游戏 pygame-aircraft-game使用 Pygame 开发…...

《Zabbix Proxy分布式监控实战:从安装到配置全解析》
注意:实验所需的zabbix服务器的搭建可参考博客 zabbix 的docker安装_docker安装zabbix-CSDN博客 1.1 实验介绍 1.1.1 实验目的 本实验旨在搭建一个基于Zabbix的监控系统,通过安装和配置Zabbix Proxy、MySQL数据库以及Zabbix Agent,实现分…...

华为配置篇-RSTP/MSTP实验
MSTP 一、简介二、常用命令总结三、实验 一、简介 RSTP(快速生成树协议) RSTP(Rapid Spanning Tree Protocol)是 STP 的改进版本,基于 IEEE 802.1w 标准,核心目标是解决传统 STP 收敛速度慢的问…...

git如何将本地 dev 分支与远程 dev 分支同步
要让本地 dev 分支与远程 dev 分支完全同步(丢弃本地多余的提交记录),可以按照以下步骤操作: 1. 获取远程最新状态 git fetch origin dev # 拉取远程 dev 分支的最新提交,但不会修改本地代码 IDEA中点击fetc…...
使用Python和OpenCV实现实时人脸检测与识别
前言 在计算机视觉领域,人脸检测与识别是两个非常重要的任务。人脸检测是指在图像中定位人脸的位置,而人脸识别则是进一步识别出人脸的身份。随着深度学习的发展,这些任务的准确性和效率都有了显著提升。OpenCV是一个开源的计算机视觉库&…...

Unity基础学习(九)输入系统全解析:鼠标、键盘与轴控制
目录 一、Input类 1. 鼠标输入 2. 键盘输入 3. 默认轴输入 (1) 基础参数 (2)按键绑定参数 (3)输入响应参数 (4)输入类型与设备参数 (5)不同类型轴的参…...

QT:获取软件界面窗口的尺寸大小2025.5.8
在Windows系统中,获取软件界面窗口的尺寸大小可以通过多种方法实现,以下是基于不同场景的详细解决方案: 方法1:使用Windows API获取窗口尺寸 适用于获取外部应用程序窗口的尺寸(如记事本、计算器等)。 步…...

【ML-Agents】ML-Agents示例项目导入unity报错解决
最近在跑ML-Agents的示例代码,无奈往unity中导入项目后,就出现报错。本文简要描述了各个报错的解决方法。 文章目录 一、error CS0234: The type or namespace name InputSystem does not exist in the namespace UnityEngine (are you missing an assem…...
【网络安全】SQL注入
如果文章不足还请各位师傅批评指正! 想象一下,你经营着一家咖啡店,顾客可以通过店内的点单系统下单。这个系统会根据顾客的输入,向后厨发送指令,比如“为顾客A准备一杯拿铁”。 然而,如果有个不怀好意的顾客…...

Transformer Decoder-Only 参数量计算
Transformer 的 Decoder-Only 架构(如 GPT 系列模型)是当前大语言模型的主流架构,其参数量主要由以下几个部分组成: 嵌入层(Embedding Layer)自注意力层(Self-Attention Layers)前馈…...

uni-app 中的条件编译与跨端兼容
uni-app 为了实现一套代码编译到多个平台(包括小程序,App,H5 等),引入了条件编译机制。 通过条件编译,我们可以针对不同的平台编写特定的代码,从而实现跨端兼容。 一、条件编译的作用 平台差异…...
<C#>log4net 的配置文件配置项详细介绍
log4net 是一个功能强大的日志记录工具,通过配置文件可以灵活地控制日志的输出方式、格式、级别等。以下是对 log4net 配置文件常见配置项的详细介绍: 根元素 <log4net> 这是 log4net 配置文件的根元素,所有配置项都要包含在该元素内…...