【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.pswp.cn/diannao/82217.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82217.shtml
英文地址,請注明出處:http://en.pswp.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;如果它們的順序錯誤就把它…