【SGL】Scatter-Gather List内存传输技术

news2025/5/14 0:46:45

文章目录

  • 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 问题背景

传统数据传输存在的问题:
例如从文件读取数据并通过网络发送:

  1. 文件数据从磁盘读取到内核缓冲区(page cache);
  2. 数据从内核缓冲区拷贝到用户态缓存区(应用层内存);
  3. 数据从用户态缓冲区再拷贝到内核的网络缓冲区(socket buffer);
  4. 最后通过网卡发送数据。

该方式存在的问题:

  1. 多次数据拷贝:数据在内核态和用户态之间来回复制;
  2. cpu开销高:cpu需要参与数据搬运,占用大量计算资源;
  3. 内存带宽浪费:冗余拷贝消耗内存带宽,影响系统整体性能。

3.2 零拷贝的核心思想及实现方式

零拷贝技术,通过绕过用户态,直接在内核态或硬件设备间传输数据,减少甚至消除数据拷贝次数。

零拷贝的实现方式,大概有:

  1. 内存映射 Memory Mapping,mmap
    • 原理:将文件直接映射到用户态进程的虚拟内存空间,进程通过指针直接读写文件,无需通过read()/write()系统调用
    • 实现流程:调用mmap()将文件映射到用户空间;进程直接操作映射的内存区域,修改会自动同步到文件。
  2. sendfile()系统调用
    • 原理:直接在两个文件描述符(如文件到socket)之间传输数据,全程在内核态完成
    • 实现流程(以Linux为例):调用sendfile();数据从文件的page cache直接拷贝到socket缓冲区;网卡通过DMA从socket缓冲区读取数据发送
  3. 硬件辅助的零拷贝
    • 原理:结合DMA控制器和SGL,设备直接访问多个非连续内存块,无需CPU拷贝
    • 实现流程:构建SGL描述数据的内存地址和长度;网卡或磁盘控制器通过DMA按SGL直接读写内存

4. sgl在存储行业的应用

以分布式存储与对象存储为例,对象存储系统需要将大对象拆分为多个分片存储在不同节点:将对象分片的存储节点地址和偏移量写入sgl,客户端或服务端通过sgl并发读写多个分片。

再例如,文件数据在内存中可能分散在多个page cache页(例如大文件被拆分为多个4KB页):文件系统将文件的page cache页地址构建为sgl,存储设备通过sgl直接读取这些页,无需合并到连续内存。

sgl内存传输技术通过消除数据拷贝、直接操作非连续内存块,成为存储行业高性能I/O的核心技术

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

-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 单链断裂的修复,从而…

Windows重置网络,刷新缓存

同时按键盘上的【Windows】键和【S】键,弹出搜索框,输入 命令提示符 在“最佳匹配”下的【命令提示符】上右键,点击【以管理员身份运行】 1弹出一个窗口,在光标闪烁的位置,直接输入【netsh winsock reset】&#xff0…

OpenHarmony平台驱动开发(十),MMC

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

解决IDEA无法运行git的问题

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

HTTP 响应状态码总结

一、引言 HTTP 响应状态码是超文本传输协议(HTTP)中服务器对客户端(通常是 Web 浏览器)请求的响应指示。这些状态码是三位数字代码,用于告知客户端请求的结果,包括请求是否成功。响应被分为五个类别&#…

【Qt】Qt 构建系统详解:qmake 入门到项目实战

Qt 构建系统详解:qmake 入门到项目实战 本文将系统介绍 Qt 构建工具 qmake 的用法,并通过一个完整的项目结构示例,帮助你掌握 .pro 文件编写、子项目管理、模块依赖等核心技能。 🧭 一、什么是 qmake? qmake 是 Qt 提…

《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…

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…

Transformer Decoder-Only 参数量计算

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

uni-app 中的条件编译与跨端兼容

uni-app 为了实现一套代码编译到多个平台(包括小程序,App,H5 等),引入了条件编译机制。 通过条件编译,我们可以针对不同的平台编写特定的代码,从而实现跨端兼容。 一、条件编译的作用 平台差异…

Unity接入SDK之修改Unity启动页面

原理就是在Android Studio新建Activity继承UnityPlayerActivity,然后再Unity中修改启动页面。 一,Android Studio篇 首先新建一个项目, 新建完成之后基于新建的项目新建一个module,选择为Android Library类型 新建的Library再目…

yarn workspace使用指南

作用 Yarn workspace 是 Yarn 包管理工具中的一个功能,主要用于管理多包项目(monorepo)。它的主要作用如下: 支持多包结构:允许在一个仓库中管理多个独立的包或项目。项目间依赖管理:方便地在不同包之间添…

VUE el-select下拉框动态设置禁用,删除后恢复可选择

场景:点击新增添加按钮,列表table会新增一条包含下拉菜单的数据,如果其中任何一个下拉框选择了某个值,那么新增的下拉菜单的选项中该值是禁用状态,只能选择其他未被选中过的值。点击删除按钮后,已禁用的选项…