零拷貝詳解

1、在沒有DMA技術之前的I/O過程是這樣的:

  • CPU發出對應的指令給磁盤控制器,然后返回
  • 磁盤控制器收到指令后,于是就開始準備數據,會把數據放入到磁盤控制器的內部緩沖區,然后產生中斷
  • CPU收到中斷信號后,停下手頭工作,接著把磁盤控制器的緩沖區的數據一次一個字節地讀進自己的寄存器。然后再把寄存器里的數據寫入到內存,而在數據傳輸的期間CPU是無法執行其他任務 的。

在這里插入圖片描述

整個傳輸過程中都要CPU親自參與搬運數據的過程,而且這個過程,CPU是不能做其他事情的。這會大大降低CPU的效率,并且如果使用千兆網卡或者硬盤傳輸大量數據時,都用CPU搬運的話,肯定忙不過來

2、DMA技術

直接內存訪問 (Direct Memory Access) ,簡單理解就是,在進行I/O設備和內存的數據傳輸的時候,數據搬運的工作全部交給DMA控制器,而CPU不再參與任何與數據搬運相關的事情,這樣CPU就可以去處理其他的事務。

在這里插入圖片描述

與磁盤的交互(IO操作)都交給了DMA控制器去做,CPU得到解放

具體過程:

  • ?戶進程調? read ?法,向操作系統發出 I/O 請求,請求讀取數據到??的內存緩沖區中,進程進?阻塞狀態;
  • 操作系統收到請求后,進?步將 I/O 請求發送 DMA ,然后讓 CPU 執?其他任務;
  • DMA 進?步將 I/O 請求發送給磁盤;
  • 磁盤收到 DMA 的 I/O 請求,把數據從磁盤讀取到磁盤控制器的緩沖區 中,當磁盤控制器的緩沖區被讀滿后,向 DMA 發起中斷信號,告知??緩沖區已滿;
  • DMA 收到磁盤的信號,將磁盤控制器緩沖區中的數據拷?到內核緩沖區中 ,此時不占? CPU,CPU 可以執?其他任務;
  • 當 DMA 讀取了?夠多的數據,就會發送中斷信號給 CPU;
  • CPU 收到 DMA 的信號,知道數據已經準備好,于是將數據從內核拷?到?戶空間 ,系統調?返回

早期DMA只存在于主板上,如今IO設備越來越多,數據傳輸的需求也不盡相同,所以每個I/O設備里面都有自己的DMA控制器

3、傳統的文件傳輸

如果服務端要提供文件傳輸的功能,我們能想到的最簡單的方式是:將磁盤上的文件讀取出來,然后通過網絡協議發送給客戶端。

而傳統的I/O的工作方式是,數據讀取和寫入是從用戶空間到內核空間來回復制,而內核空間的數據是通過操作系統的I/O接口從磁盤讀取或寫入。

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

這兩行代碼干了非常多的事,如圖:

在這里插入圖片描述

可以看到,這期間發生了4次用戶態與內核態的上下文切換 ,因為發生了兩次系統調用,一次是read(),一次是write()。每一次系統調用,都要從用戶態切換到內核態,等內核態完成任務后又要切換回用戶態。而上下文切換的成本也很大,尤其在高并發的場景下,這類時間容易被累積放大,從而影響系統的性能。

其次,還發生了4次數據拷貝 ,兩次是DMA拷貝,兩次是CPU拷貝。

  • 第?次拷?,把磁盤上的數據拷?到操作系統內核的緩沖區?,這個拷?的過程是通過 DMA 搬運的。
  • 第?次拷?,把內核緩沖區的數據拷?到?戶的緩沖區?,于是我們應?程序就可以使?這部分數據了,這個拷?到過程是由 CPU 完成的。
  • 第三次拷?,把剛才拷?到?戶的緩沖區?的數據,再拷?到內核的 socket 的緩沖區?,這個過程依然還是由 CPU 搬運的。
  • 第四次拷?,把內核的 socket 緩沖區?的數據,拷?到?卡的緩沖區?,這個過程?是由 DMA 搬運的

只是搬運一份數據,結果卻進行了四次數據拷貝,過多的數據拷貝會消耗CPU資源,大大降低系統性能。

這種傳統的文件傳輸存在冗余的上下文切換和拷貝次數!

優化文件傳輸

1、如何減少用戶態與內核態的上下文切換的次數

讀取磁盤數據時,之所以要發生上下文切換,這是因為用戶空間沒有權限操作磁盤或網卡,內核的權限最高。所以一般要通過內核去完成某些任務的時候,就需要使用操作系統提供的系統調用函數。

而一次系統調用必然會發生2次上下文切換:從用戶態切換到內核態,內核態完成任務后再切換回用戶態

所以要減少上下文切換的次數就要減少系統調用的次數

2、如何減少數據拷貝的次數

傳統的文件傳輸過程會經過四次數據拷貝,而這其中,從內核的讀緩沖區拷貝到用戶的緩沖區中,再從用戶的緩沖區拷貝到socket的緩沖區 ,這個過程是沒有必要的。因為文件傳輸的應用場景中,在用戶空間我們并不會對數據再加工 ,可以省去拷貝到數據緩沖區這一步。

零拷貝

1、實現零拷貝技術的方式通常有2種:

  • mmap+write
  • sendfile

它們是如何減少上下文切換和數據拷貝的次數?

2、mmap+write

read()系統調用的過程,會將內核緩沖區的數據拷貝到用戶的緩沖區,為了減少這一步開銷,我們可以用mmap()替換read()系統調用函數。

buf = mmap(file, len);
write(sockfd, buf, len);

mmap()系統調用函數會直接把內核緩沖區里的數據映射到用戶空間,這樣操作系統內核與用戶空間就不需要再進行任何的數據拷貝操作

這樣做會將內核的讀緩沖區拷貝到用戶緩沖區,再從用戶緩沖區拷貝到socket的緩沖區 這兩次拷貝變成內核緩沖區拷貝到socket緩沖區 這一次拷貝

即從原來的四次拷貝變為三次拷貝,減少了一次數據拷貝的過程。

但這并不是理想的零拷貝,因為仍然需要通過CPU把內核緩沖區的數據拷貝到socket緩沖區中,而且仍然需要4次上下文切換

3、sendfile

在Linux內核版本2.1中,提供了一個專門發送文件的系統調用函數sendfile()。

  • ?先,它可以替代前?的 read() 和 write() 這兩個系統調?,這樣就可以減少?次系統調? ,也就減少了 2 次上下?切換的開銷。
  • 其次,該系統調?,可以直接把內核緩沖區?的數據拷?到 socket 緩沖區? ,不再拷?到?戶態,這樣就只有 2 次上下?切換,和 3 次數據拷?。

從 Linux 內核 2.4 版本開始起,對于?持?卡?持 SG-DMA 技術的情況下, sendfile() 系統,調?的過程發?了點變化,具體過程如下:

  • 第?步,通過 DMA 將磁盤上的數據拷?到內核緩沖區?;(DMA拷貝)
  • 第?步,緩沖區描述符和數據?度傳到 socket 緩沖區,這樣?卡的 SG-DMA 控制器就可以直接將內核緩存中的數據拷?到?卡的緩沖區? ,此過程不需要將數據從操作系統內核緩沖區拷?到socket 緩沖區中,這樣就減少了?次數據拷?;(SG-DMA拷貝)

所以,這個過程之中,只進行了一次系統調用(sendfile(),進?了 2 次數據拷?(磁盤到內核,內核到網卡)

這就是所謂的零拷貝技術。因為我們沒有在內存層面去拷貝數據,全程沒有通過CPU來搬運數據

在這里插入圖片描述

4、總結

實現零拷貝技術的文件傳輸方式相比傳統文件傳輸的方式,減少了2次上下文切換和數據拷貝次數。只需要進行兩次上下文切換和兩次數據拷貝就可以完成文件的傳輸。并且兩次數據拷貝都不要通過CPU完成,是由DMA來完成。總體來看,零拷貝技術可以把文件傳輸的性能提高至少一倍以上

總結

1、早期I/O操作,內存與磁盤的數據傳輸的工作都是由CPU完成,此時CPU不能進行其他任務,會特別浪費CPU資源

2、為了解決這一問題,出現了DMA技術。每個I/O設備都有自己的DMA控制器,通過這個DMA 控制器,CPU 只需要告訴 DMA 控制器,我們要傳輸什么數據,從哪?來,到哪?去,就可以放?離開了。后續的實際數據傳輸?作,都會由 DMA 控制器來完成,CPU 不需要參與數據傳輸的?作。

3、傳統的IO工作方式,從硬盤讀取數據,通過網卡向外發送 。需要進行4次用戶態與內核態之間的上下文切換,4次數據拷貝。其中2次數據拷貝發生在內核的緩沖區和對應的硬件設備(磁盤、網卡)之間,由DMA完成;2次數據拷貝發送在用戶態和內核態之間,由CPU完成。這種傳輸方式有冗余的上下文切換次數和數據拷貝次數!

4、對于文件傳輸的優化,實現零拷貝。通過一次系統調用(sendfile)合并了磁盤讀取(read)和網絡發送(write)兩個操作 ,降低了上下文切換次數;只進行了兩次數據拷貝,從磁盤文件到內核緩沖區,從內核緩沖區到網卡,都是由DMA搬運,降低了數據拷貝次數

5、零拷貝技術是基于 PageCache 的,PageCache 會緩存最近訪問的數據,提升了訪問緩存數據的性能,同時,為了解決機械硬盤尋址慢的問題,它還協助 I/O 調度算法實現了 IO 合并與預讀,這也是順序讀?隨機讀性能好的原因。這些優勢,進?步提升了零拷?的性能。

6、當傳輸大文件時,不能使用零拷貝,因為可能由于 PageCache 被??件占據,?導致「熱點」小文件無法利用到 PageCache,并且大文件的緩存命中率不?,這時就需要使用「異步 IO + 直接 IO 」的方式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38405.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38405.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38405.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為OD機試-5鍵鍵盤的輸出

題目描述 【5鍵鍵盤的輸出】有一個特殊的 5鍵鍵盤,上面有 a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五個鍵。 a鍵在屏幕上輸出一個字母 a; ctrl-c將當前選擇的字母復制到剪貼板; ctrl-x將當前選擇的 字母復制到剪貼板,并清空選擇的字母; ctrl-v將當前剪貼板里的字母…

HTML是什么?

HTML是什么? 超文本標記語言(英語:HyperText Markup Language,簡稱:HTML)是一種用于創建網頁的標準標記語言。 您可以使用 HTML 來建立自己的 WEB 站點,HTML 運行在瀏覽器上,由瀏覽器…

【業務功能篇63】Springboot聊聊 過濾器和攔截器

過濾器的場景:過濾器通常用于對數據或資源進行篩選、修改或轉換的場景。例如,在一個電子商務網站中,用戶進行商品搜索時,你可以使用過濾器來過濾特定的商品類別、價格范圍或其他條件,以便用戶僅看到符合篩選條件的結果…

人工智能時代的科學探索 | 《自然》評述

人工智能(AI)正越來越多地融入科學發現,以增強和加速研究,幫助科學家提出假設、設計實驗、收集和解釋大型數據集,并獲得僅靠傳統科學方法可能無法實現的洞察力。 過去十年間,AI取得了巨大的突破。其中就包括自監督學習和幾何深度學…

手機的發展歷史

目錄 一.人類的通信方式變化 二.手機對人類通信的影響 三.手機的發展過程 四.手機對現代人的影響 一.人類的通信方式變化 人類通信方式的變化是一個非常廣泛和復雜的話題,隨著技術的進步和社會的發展,人類通信方式發生了許多重大的變化。下面是一些主…

go mod使用最新提交依賴

例如一個項目在其中依賴了 github.com/linuxsuren/go-fake-runtime v0.0.1 go.mod內容: github.com/linuxsuren/go-fake-runtime v0.0.1 修改了github.com/linuxsuren/go-fake-runtime代碼,存在一個最新的commit hash值為25fa814c6232e545f5bce03bd…

【opencv】指定寬或高按比例縮放圖片 拼接圖片

指定寬或高按比例縮放圖片 import cv2def resize_by_ratio(image, widthNone, heightNone, intercv2.INTER_AREA):img_new_size None(h, w) image.shape[:2] # 獲得高度和寬度if width is None and height is None: # 如果輸入的寬度和高度都為空return image # 直接返回原圖…

應用程序運行報錯:First section must be [net] or [network]:No such file or directory

應用程序報錯環境: 在linux下,調用darknet訓練的模型,報錯:First section must be [net] or [network]:No such file or directory,并提示:"./src/utils.c:256: error: Assertion 0 failed." 如…

百日筑基篇——Pandas學習三(pyhton入門八)

百日筑基篇——Pandas學習三(pyhton入門八) 文章目錄 前言一、數據排序二、字符串處理三、數據合并方法1. merge方法2. concat方法 四、分組數據統計五、數據重塑1. stack2. pivot 總結 前言 上一篇文章介紹了一下pandas庫中的一些函數,而本…

MySQL數據類型

文章目錄 MySQL數據類型1. 數據類型分類2. 數值類型2.1 tinyint類型2.2 bit類型2.3 小數類型2.3.1 float2.3.2 decimal 2.4 字符串類型2.4.1 char2.4.2 varchar2.4.3 char和varchar比較 2.5 日期和時間類型2.6 enum和set MySQL數據類型 1. 數據類型分類 紅色標注是我主要講解…

【QT】 QFileQFileInfo文件操作

很高興在雪易的CSDN遇見你 ,給你糖糖 歡迎大家加入雪易社區-CSDN社區云 前言 本文分享QT對文件的操作技術,希望對各位小伙伴有所幫助! 感謝各位小伙伴的點贊關注,小易會繼續努力分享,一起進步! 你的點…

linux中profile.d和profile的區別

profile.d在profile中加載 profile文件 PATH"/bin:/sbin:/usr/bin:/usr/sbin:/opt/bin:/opt/scripts:/soc/bin:/soc/scripts" LD_LIBRARY_PATH"/usr/local/lib:/usr/lib:/opt/lib:/soc/lib" export SSL_LDPATH/usr/local/lib/ export ZLIB_LDPATH/usr/lo…

appium默認60秒關閉應用的問題

問題:appium默認啟動一個應用的session過期時間是60秒到時間會自動停了剛啟動的應用,工作臺打印:info: [debug] We shut down because no new commands came in的日志 分析:--command-timeout 60 The default command timeout fo…

商城-學習整理-高級-全文檢索-ES(九)

目錄 一、ES簡介1、網址2、基本概念1、Index(索引)2、Type(類型)3、Document(文檔)4、倒排索引機制4.1 正向索引和倒排索引4.2 正向索引4.3 倒排索引 3、相關軟件及下載地址3.1 Kibana簡介3.2 logstash簡介…

【C++深入淺出】初識C++上篇(關鍵字,命名空間,輸入輸出,缺省參數,函數重載)

目錄 一. 前言 二. 什么是C 三. C關鍵字初探 四. 命名空間 4.1 為什么要引入命名空間 4.2 命名空間的定義 4.3 命名空間使用 五. C的輸入輸出 六. 缺省參數 6.1 缺省參數的概念 6.2 缺省參數的分類 七. 函數重載 7.1 函數重載的概念 7.2 函數重載的條件 7.3 C支…

ChatGPT在智能家居控制和環境管理中的應用如何?

智能家居控制和環境管理是近年來在科技領域迅速發展的重要領域之一。智能家居技術通過將物聯網、人工智能和自動化技術相結合,實現了家居設備的智能化、自動化控制和遠程管理。ChatGPT作為強大的自然語言處理模型,在智能家居控制和環境管理方面具有廣泛的…

軟件測試項目實戰,電商業務功能測試點匯總(全覆蓋)

目錄:導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結(尾部小驚喜) 前言 支付功能怎么測試…

Spring--BeanFactory和FactoryBean區別

BeanFactory 和 FactoryBean 是 Spring 框架中兩個不同的概念,它們在對象的管理和創建過程中具有不同的角色和功能。下面是它們之間的區別: BeanFactory: BeanFactory 是 Spring 框架的核心接口之一,它是一個對象容器&#xff0c…

C語言刷題訓練【第11天】

大家好,我是紀寧。 今天是C語言筆試刷題訓練的第11天,加油! 文章目錄 1、聲明以下變量,則表達式: ch/i (f*d – i) 的結果類型為( )2、關于代碼的說法正確的是( )3、已知有如下各變…

使用 Visual Studio GoogleTest編寫 C/C++ 單元測試——入門篇

入門教程 Visual Studio 新建 GoogleTest項目,一路選默認參數 pch.h #pragma once#include "gtest/gtest.h"int add(int a, int b);pch.cpp #include "pch.h"int add(int a, int b) {return a b; }test.cpp #include "pch.h"TES…