女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳解Linux系統中的零拷貝技術

書生途 ? 來源:書生途 ? 作者:書生途 ? 2022-05-18 09:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.前言

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

2. 數據拷貝基礎過程

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

pYYBAGKDpOGAPJZfAAAcNVKnN_0687.jpg

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

2.1 僅CPU方式

  • 當應用程序需要讀取磁盤數據時,調用read()從用戶態陷入內核態,read()這個系統調用最終由CPU來完成;
  • CPU向磁盤發起I/O請求,磁盤收到之后開始準備數據;
  • 磁盤將數據放到磁盤緩沖區之后,向CPU發起I/O中斷,報告CPU數據已經Ready了;
  • CPU收到磁盤控制器的I/O中斷之后,開始拷貝數據,完成之后read()返回,再從內核態切換到用戶態;
poYBAGKDpOGAX8wMAACBio1Wd8s482.jpg

2.2 CPU&DMA方式

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

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

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

pYYBAGKDpOGAGC40AABrkKuhAc0439.jpg

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

poYBAGKDpOGATnstAAB-YLAEwi4057.jpg

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

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

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

3.普通模式數據交互

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

pYYBAGKDpOKAY9-PAAAvmMfdVbo564.jpg

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

  • 調用syscall 從用戶態切換到內核態
  • syscall返回 從內核態切換到用戶態
poYBAGKDpOKAfo94AABa6xahwiA547.jpg

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

pYYBAGKDpOKAUWLFAACW-FRuHQI637.jpg

讀數據過程:

  • 應用程序要讀取磁盤數據,調用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拷貝;

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

【文章福利】需要C/C++ Linux服務器架構師學習資料點擊加群1106675687(資料包括C/C++,Linux,golang技術,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK,ffmpeg等)

poYBAGKDpOKACNgyAADNQFdFy4Q510.jpg

4. 零拷貝技術

4.1 出現原因

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

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

4.2 解決思路

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

pYYBAGKDpOKAJOWxAABA7v1ZNgw627.jpg

4.2.1 mmap方式

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

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

poYBAGKDpOKAU9GfAACk90sxlZ4568.jpg

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

4.2.2 sendfile方式

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

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

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

pYYBAGKDpOKAcOlZAACFtkEmL5Y768.jpgpoYBAGKDpOKAIUeGAACFRHIPdfk833.jpg

從圖中可以看到,應用程序只需要調用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拷貝。

pYYBAGKDpOOAQIQjAACUW9WZcJg234.jpg

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

4.2.4 splice方式

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

poYBAGKDpOOANK5ZAACDaK62x48633.jpg

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

pYYBAGKDpOOAOB1OAACKsPPKCIU836.jpg

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

5.本文小結

本文通過介紹數據交互的基本過程、傳統模式的缺點,進而介紹了零拷貝的一些實現方法。

零拷貝技術是非常底層且重要的讀寫優化,對于服務并發能力的提升有很大幫助。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11076

    瀏覽量

    217012
  • Linux
    +關注

    關注

    87

    文章

    11509

    瀏覽量

    213724
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    深度解析Linux拷貝原理

    所謂「拷貝」描述的是計算機操作系統當中,CPU不執行將數據從一個內存區域,拷貝到另外一個內存區域的任務。通過網絡傳輸文件時,這樣通常可以節省 CPU 周期和內存帶寬。
    發表于 03-01 14:39 ?2769次閱讀

    Linux LED子系統詳解

    Linux LED子系統詳解
    的頭像 發表于 06-10 10:37 ?1884次閱讀
    <b class='flag-5'>Linux</b> LED子<b class='flag-5'>系統</b><b class='flag-5'>詳解</b>

    Linux系統命令及其使用詳解

    Linux系統命令及其使用詳解
    發表于 08-20 13:38

    嵌入式Linux系統開發技術詳解——基于ARM

    嵌入式Linux系統開發技術詳解——基于ARM,一共6個部分,給大家參考
    發表于 06-24 21:19

    ARM嵌入式Linux系統開發詳解

    Linux技術的*發展,全部采用當前最流行和穩定的Linux發行版或者相關工具,是Linux愛好者學習Linux的好幫手。《
    發表于 09-14 08:57

    Linux拷貝命令

    Linux cp命令拷貝命令非常實用,cp命令可以將指定路徑下的文件(目錄)拷貝到(成)另一文件或目錄
    發表于 07-24 08:32

    RAID拷貝技術研究

    從實際測試和理論分析角度出發,研究了采用拷貝技術對提高RAID性能的重要性.研究結果表明拷貝技術
    發表于 07-01 17:09 ?20次下載

    linux核心技術詳解

    很好的一本Linux技術詳解,值得一讀。
    發表于 11-09 17:35 ?5次下載

    Linux設備驅動開發詳解》第5章、Linux文件系統與設備文件系統

    Linux設備驅動開發詳解》第5章、Linux文件系統與設備文件系統
    發表于 10-27 14:13 ?0次下載
    《<b class='flag-5'>Linux</b>設備驅動開發<b class='flag-5'>詳解</b>》第5章、<b class='flag-5'>Linux</b>文件<b class='flag-5'>系統</b>與設備文件<b class='flag-5'>系統</b>

    Linux系統EXP命令詳解質量匯總

    Linux系統EXP命令詳解質量匯總
    發表于 05-14 09:35 ?1次下載

    深度解讀Linux的3種“拷貝”命令

    概述 Linux 下有 3 種“拷貝”,分別是 ln,cp,mv,這 3 個命令貌似都能 copy 出一個新的文件出來。 細心的小伙伴看到我給 “拷貝” 打上了雙引號?因為 Linux
    的頭像 發表于 05-28 15:35 ?3550次閱讀
    深度解讀<b class='flag-5'>Linux</b>的3種“<b class='flag-5'>拷貝</b>”命令

    深入理解Linux系統拷貝技術

    內存拷貝是比較耗時操作,拷貝是常用優化手段,今天分享的文章就是Linux系統
    的頭像 發表于 09-01 15:12 ?3267次閱讀

    傳統IO演化至拷貝的過程

    拷貝(Zero-Copy)用于在數據讀寫過程減少不需要的CPU拷貝,CPU就那么幾個,減少它的負擔自然可以提高處理效率。數據傳輸有本地的文件拷貝
    的頭像 發表于 11-09 09:09 ?731次閱讀
    傳統IO演化至<b class='flag-5'>零</b><b class='flag-5'>拷貝</b>的過程

    什么是拷貝技術

    的應用,經常會發生這種問題,導致CPU都在做數據拷貝,沒有時間處理其他的應用功能了,直接的感覺就是處理卡頓。 拷貝技術 針對這種問題,
    的頭像 發表于 11-27 16:20 ?724次閱讀
    什么是<b class='flag-5'>零</b><b class='flag-5'>拷貝</b><b class='flag-5'>技術</b>

    如何進行拷貝性能測試

    TogetherROS?·Bot拷貝性能測試 我們使用TogetherROS?·Bot系統內部集成的性能測試工具——performance_test,來評估下開啟
    的頭像 發表于 11-27 16:51 ?719次閱讀
    如何進行<b class='flag-5'>零</b><b class='flag-5'>拷貝</b>性能測試