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

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

  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.mzph.cn/diannao/82217.shtml

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

相关文章

10.idea中创建springboot项目_jdk17

10.idea中创建springboot项目_jdk17 一、前期准备 安装与配置: 确保已安装 IntelliJ IDEA配置好 JDK17 二、创建 Maven 项目 新建项目: 点击 File → New → Project,选择左侧的 Maven。填写项目名称(如 demo)、存…

如何使用极狐GitLab 软件包仓库功能托管 ruby?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 软件包库中的 Ruby gems (BASIC ALL) WARNING:Ruby gems 软件包库正在开发中,由于功能有限,尚未准备好…

LeetCode 热题 100 131. 分割回文串

LeetCode 热题 100 | 131. 分割回文串 大家好,今天我们来解决一道经典的回溯算法问题——分割回文串。这道题在 LeetCode 上被标记为中等难度,要求将一个字符串 s 分割成若干个子串,使得每个子串都是回文串,并返回所有可能的分割…

〖 Linux 〗操作系统进程管理精讲(2)

文章目录 1、环境变量基本概念常见环境变量查看环境变量方法测试 PATH测试 HOME和环境变量相关的命令环境变量的组织方式<p align"center">main 函数的三个参数通过代码获得环境变量通过系统调用获取环境变量环境变量通常是具有全局属性的 2、程序地址空间2.1 …

vite:npm 安装 pdfjs-dist , PDF.js View 示例

pdfjs-dist 是 Mozilla 的 PDF.js 库的预构建版本&#xff0c;能让你在项目里展示 PDF 文件。下面为你介绍如何用 npm 安装 pdfjs-dist 并应用 pdf.js 和 pdf.worker.js。 为了方便&#xff0c;我将使用 vite 搭建一个原生 js 项目。 1.创建项目 npm create vitelatest pdf-v…

精品,架构师总结,MySQL 5.7 查询入门详解

文章目录 MySQL 5.7 查询入门详解一、数据库与表基础操作1.1 连接数据库1.2 创建数据库1.3 使用数据库1.4 创建数据表1.5 表结构查看 二、SELECT基础查询2.1 全列查询2.2 指定列查询2.3 别名使用2.4 去重查询2.5 表达式计算 三、WHERE条件查询3.1 比较运算符3.2 逻辑运算符3.3 …

P48-56 应用游戏标签

这一段课主要是把每种道具的游戏Tag进行了整理与应用 AuraAbilitySystemComponentBase.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "AbilitySystemComponent.h"…

【AWS+Wordpress】将本地 WordPress 网站部署到AWS

前言 自学笔记&#xff0c;解决问题为主&#xff0c;亲测有效&#xff0c;欢迎补充。 本地开发机&#xff1a;macOS&#xff08;Sequoia 15.0.1&#xff09; 服务器&#xff1a;AWS EC2&#xff08;Amazon Linux 2023&#xff09; 目标&#xff1a;从本地迁移 WordPress 到云…

从零开始:用PyTorch构建CIFAR-10图像分类模型达到接近1的准确率

为了增强代码可读性&#xff0c;代码均使用Chatgpt给每一行代码都加入了注释&#xff0c;方便大家在本文代码的基础上进行改进优化。 本文是搭建了一个稍微优化了一下的模型&#xff0c;训练200个epoch&#xff0c;准确率达到了99.74%&#xff0c;简单完成了一下CIFAR-10数据集…

C++复习类与对象基础

类的成员函数为什么需要在类外定义 1.1 代码组织与可读性​ ​类内定义​&#xff1a;适合 ​短小简单的函数​&#xff08;如 getter/setter&#xff09;&#xff0c;能直观体现类的接口设计。 ​类外定义​&#xff1a;当函数体较复杂时&#xff0c;将实现移到类外&#xf…

【计算机网络】Cookie、Session、Token之间有什么区别?

大家在日常使用浏览器时可能会遇到&#xff1a;是否清理Cookie&#xff1f;这个问题。 那么什么是Cookie呢&#xff1f;与此相关的还有Session、Token这些。这两个又是什么呢&#xff1f; 本文将对这三个进行讲解区分&#xff0c;如果对小伙伴有帮助的话&#xff0c;也请点赞、…

Python 3.x 内置装饰器 (4) - @dataclass

dataclass 是Python 3.7 引入的一个装饰器&#xff0c;用来简化创建数据类&#xff08;主要存储数据的类&#xff09;的过程。它会自动为类生成一些常用的方法&#xff0c;比如&#xff1a; __init__: 对象的初始化 __repr__: 定义类的官方字符串表示。 __eq__: 定义两个对象…

第一次被AI指点出文章的问题

二十年&#xff0c;几乎从未收到过这种程度的反馈。大部分意见都是有效的批评。 1.前言 关于链家左晖的一篇评论稿 这篇文章有什么问题吗&#xff1f;所有方面都可以谈&#xff0c;包括叙述&#xff0c;用词&#xff0c;重复&#xff0c;真实性&#xff0c;偏见&#xff0c;…

var、let、const三者之间的区别和使用

var、let、const 都是用于声明变量的关键字&#xff0c;可以通过作用域、可变性、变量提升几个方面进行区分&#xff1b; 1&#xff0c;作用域 1&#xff09;var的属于函数作用域&#xff0c;只能在函数内使用。若在函数外部声明变量&#xff0c;会变为全局变量&#xff1b; …

Consumer Group的作用是什么?Rebalance的触发条件有哪些? (实现消费者负载均衡;消费者加入/离开、订阅Topic变化等)

好的&#xff0c;我现在需要回答用户关于Kafka Consumer Group和Rebalance的问题。首先&#xff0c;用户问的是Consumer Group的作用以及Rebalance的触发条件。根据之前的对话历史&#xff0c;用户已经了解了Kafka的基本组件、消息保留策略、顺序性保证等&#xff0c;现在的问题…

出一期Source Insigned的使用教程

1. 创建新项目 打开 Source Insight&#xff0c;点击菜单栏的 Project > New Project。在弹出的窗口中&#xff0c;输入项目名称&#xff08;建议与项目内容相关&#xff0c;便于识别&#xff09;。指定项目数据文件的存储路径&#xff08;即 Source Insight 配置文件保存的…

A. Row GCD(gcd的基本性质)

Problem - 1458A - Codeforces 思路&#xff1a; 首先得知道gcd的两个基本性质&#xff1a; (1) gcd(a,b)gcd(a,|b-a|) (2) gcd(a,b,c)gcd(a,gcd(b,c)) 结合题目所给的a1bj&#xff0c;a2bj...... anbj 根据第一条性质得到&#xff1a; gcd(a1bj&#xff0c;a2bj)gcd(…

ES6入门---第三单元 模块三:async、await

async function fn(){ //表示异步&#xff1a;这个函数里面有异步任务 let result await xxx //表示后面结果需要等待 } 读取文件里数据实例&#xff1a; const fs require(fs);//简单封装 fs封装成一个promise const readFile function (fileName){return…

如何在 C# 和 .NET 中打印 DataGrid

DataGrid 是 .NET 架构中一个功能极其丰富的组件&#xff0c;或许也是最复杂的组件之一。写这篇文章是为了回答“我到底该如何打印 DataGrid 及其内容”这个问题。最初即兴的建议是使用我的屏幕截图文章来截取表单&#xff0c;但这当然无法解决打印 DataGrid 中虚拟显示的无数行…

C语言 指针(5)

目录 1.冒泡排序 2.二级指针 3.指针数组 4.指针数组模拟二级数组 1.冒泡排序 1.1 基本概念 冒泡排序&#xff08;Bubble Sort&#xff09; 是一种简单的排序算法&#xff0c;它重复地遍历要排序的数列&#xff0c;一次比较两个元 素&#xff0c;如果它们的顺序错误就把它…