中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

零拷貝Zero-Copy技術如何理解

發布時間:2022-01-07 18:21:29 來源:億速云 閱讀:128 作者:柒染 欄目:系統運維

這篇文章將為大家詳細講解有關零拷貝Zero-Copy技術如何理解,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

 1.前言

今天和大家一起學習個底層技術點-零拷貝Zero-Copy。

Linux系統中一切皆文件,仔細想一下Linux系統的很多活動無外乎讀操作和寫操作,零拷貝就是為了提高讀寫性能而出現的。

廢話不多說,馬上開大車,走起!

2. 數據拷貝基礎過程

在Linux系統內部緩存和內存容量都是有限的,更多的數據都是存儲在磁盤中。對于Web服務器來說,經常需要從磁盤中讀取數據到內存,然后再通過網卡傳輸給用戶:

零拷貝Zero-Copy技術如何理解

上述數據流轉只是大框,接下來看看幾種模式。

2.1 僅CPU方式

  • 當應用程序需要讀取磁盤數據時,調用read()從用戶態陷入內核態,read()這個系統調用最終由CPU來完成;

  • CPU向磁盤發起I/O請求,磁盤收到之后開始準備數據;

  • 磁盤將數據放到磁盤緩沖區之后,向CPU發起I/O中斷,報告CPU數據已經Ready了;

  • CPU收到磁盤控制器的I/O中斷之后,開始拷貝數據,完成之后read()返回,再從內核態切換到用戶態;

零拷貝Zero-Copy技術如何理解

2.2 CPU&DMA方式

CPU的時間寶貴,讓它做雜活就是浪費資源。

直接內存訪問(Direct Memory  Access),是一種硬件設備繞開CPU獨立直接訪問內存的機制。所以DMA在一定程度上解放了CPU,把之前CPU的雜活讓硬件直接自己做了,提高了CPU效率。

目前支持DMA的硬件包括:網卡、聲卡、顯卡、磁盤控制器等。

零拷貝Zero-Copy技術如何理解

有了DMA的參與之后的流程發生了一些變化:

零拷貝Zero-Copy技術如何理解

最主要的變化是,CPU不再和磁盤直接交互,而是DMA和磁盤交互并且將數據從磁盤緩沖區拷貝到內核緩沖區,之后的過程類似。

“【敲黑板】無論從僅CPU方式和DMA&CPU方式,都存在多次冗余數據拷貝和內核態&用戶態的切換。”

我們繼續思考Web服務器讀取本地磁盤文件數據再通過網絡傳輸給用戶的詳細過程。

3.普通模式數據交互

一次完成的數據交互包括幾個部分:系統調用syscall、CPU、DMA、網卡、磁盤等。

零拷貝Zero-Copy技術如何理解

系統調用syscall是應用程序和內核交互的橋梁,每次進行調用/返回就會產生兩次切換:

  • 調用syscall 從用戶態切換到內核態

  • syscall返回 從內核態切換到用戶態

零拷貝Zero-Copy技術如何理解

來看下完整的數據拷貝過程簡圖:

零拷貝Zero-Copy技術如何理解

讀數據過程:

  • 應用程序要讀取磁盤數據,調用read()函數從而實現用戶態切換內核態,這是第1次狀態切換;

  • DMA控制器將數據從磁盤拷貝到內核緩沖區,這是第1次DMA拷貝;

  • CPU將數據從內核緩沖區復制到用戶緩沖區,這是第1次CPU拷貝;

  • CPU完成拷貝之后,read()函數返回實現用戶態切換用戶態,這是第2次狀態切換;

寫數據過程:

  • 應用程序要向網卡寫數據,調用write()函數實現用戶態切換內核態,這是第1次切換;

  • CPU將用戶緩沖區數據拷貝到內核緩沖區,這是第1次CPU拷貝;

  • DMA控制器將數據從內核緩沖區復制到socket緩沖區,這是第1次DMA拷貝;

  • 完成拷貝之后,write()函數返回實現內核態切換用戶態,這是第2次切換;

綜上所述:

  • 讀過程涉及2次空間切換、1次DMA拷貝、1次CPU拷貝;

  • 寫過程涉及2次空間切換、1次DMA拷貝、1次CPU拷貝;

可見傳統模式下,涉及多次空間切換和數據冗余拷貝,效率并不高,接下來就該零拷貝技術出場了。

4. 零拷貝技術

4.1 出現原因

我們可以看到,如果應用程序不對數據做修改,從內核緩沖區到用戶緩沖區,再從用戶緩沖區到內核緩沖區。兩次數據拷貝都需要CPU的參與,并且涉及用戶態與內核態的多次切換,加重了CPU負擔。

我們需要降低冗余數據拷貝、解放CPU,這也就是零拷貝Zero-Copy技術。

4.2 解決思路

目前來看,零拷貝技術的幾個實現手段包括:mmap+write、sendfile、sendfile+DMA收集、splice等。

零拷貝Zero-Copy技術如何理解

4.2.1 mmap方式

mmap是Linux提供的一種內存映射文件的機制,它實現了將內核中讀緩沖區地址與用戶空間緩沖區地址進行映射,從而實現內核緩沖區與用戶緩沖區的共享。

這樣就減少了一次用戶態和內核態的CPU拷貝,但是在內核空間內仍然有一次CPU拷貝。

零拷貝Zero-Copy技術如何理解

mmap對大文件傳輸有一定優勢,但是小文件可能出現碎片,并且在多個進程同時操作文件時可能產生引發coredump的signal。

4.2.2 sendfile方式

mmap+write方式有一定改進,但是由系統調用引起的狀態切換并沒有減少。

sendfile系統調用是在 Linux 內核2.1版本中被引入,它建立了兩個文件之間的傳輸通道。

sendfile方式只使用一個函數就可以完成之前的read+write 和  mmap+write的功能,這樣就少了2次狀態切換,由于數據不經過用戶緩沖區,因此該數據無法被修改。

零拷貝Zero-Copy技術如何理解

零拷貝Zero-Copy技術如何理解

從圖中可以看到,應用程序只需要調用sendfile函數即可完成,只有2次狀態切換、1次CPU拷貝、2次DMA拷貝。

但是sendfile在內核緩沖區和socket緩沖區仍然存在一次CPU拷貝,或許這個還可以優化。

4.2.3 sendfile+DMA收集

Linux 2.4 內核對 sendfile 系統調用進行優化,但是需要硬件DMA控制器的配合。

升級后的sendfile將內核空間緩沖區中對應的數據描述信息(文件描述符、地址偏移量等信息)記錄到socket緩沖區中。

DMA控制器根據socket緩沖區中的地址和偏移量將數據從內核緩沖區拷貝到網卡中,從而省去了內核空間中僅剩1次CPU拷貝。

零拷貝Zero-Copy技術如何理解

這種方式有2次狀態切換、0次CPU拷貝、2次DMA拷貝,但是仍然無法對數據進行修改,并且需要硬件層面DMA的支持,并且sendfile只能將文件數據拷貝到socket描述符上,有一定的局限性。

4.2.4 splice方式

splice系統調用是Linux 在 2.6 版本引入的,其不需要硬件支持,并且不再限定于socket上,實現兩個普通文件之間的數據零拷貝。

零拷貝Zero-Copy技術如何理解

splice 系統調用可以在內核緩沖區和socket緩沖區之間建立管道來傳輸數據,避免了兩者之間的 CPU 拷貝操作。

零拷貝Zero-Copy技術如何理解

splice也有一些局限,它的兩個文件描述符參數中有一個必須是管道設備。

關于零拷貝Zero-Copy技術如何理解就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

cpu
AI

宁海县| 随州市| 揭东县| 余干县| 建瓯市| 东乌珠穆沁旗| 普格县| 高唐县| 济宁市| 东丰县| 恭城| 达拉特旗| 广州市| 五指山市| 库伦旗| 南丹县| 汶川县| 南汇区| 尉氏县| 莒南县| 桐柏县| 云和县| 葫芦岛市| 常熟市| 红桥区| 金昌市| 民丰县| 伊宁县| 德阳市| 当涂县| 昌吉市| 田东县| 河东区| 巴中市| 烟台市| 青铜峡市| 合阳县| 鄂尔多斯市| 蓝田县| 吉水县| 博罗县|