那曲檬骨新材料有限公司

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

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

3天內不再提示

傳統IO演化至零拷貝的過程

科技綠洲 ? 來源:Linux開發架構之路 ? 作者:Linux開發架構之路 ? 2023-11-09 09:09 ? 次閱讀

零拷貝(Zero-Copy)用于在數據讀寫過程中減少不需要的CPU拷貝,CPU就那么幾個,減少它的負擔自然可以提高處理效率。數據傳輸有本地的文件拷貝和通過socket進行文件傳輸兩種,兩者區別不大,只是文件數據最終的去向仍然是本地磁盤還是網卡的區別,這里以socket文件為例介紹傳統IO演化至零拷貝的過程。

介紹零拷貝之前,可以先看一下傳統IO,借此熟悉一些相關概念,先上圖:

圖片

首先要知道操作系統已經隔離了兩塊運行空間,即用戶空間和內核空間。可以理解為用戶程序是跑在用戶空間的,而操作系統的內核代碼是跑在內核空間的,把這兩個隔離是為了用戶程序的故障不影響操作系統。其實現代操作系統已經對數據的拷貝做了優化,之前把數據從底層硬件拷貝到內核空間也是CPU來的,現在CPU只需要通知一下DMA(Direct Memory Access,直接內存存取),拷貝工作就交給DMA了,這樣CPU就解放出來做其他事去了,所以現代操作系統底層硬件和內核空間之間的數據拷貝CPU參與的很少可以不予考慮,都是DMA來的,但是內核空間和用戶空間之間的活都是CPU親自上的。

從上圖可以看出,傳統IO是這么幾個步驟:

1.線程在用戶空間發起read()讀文件,線程從用戶態切換為內核態

2.DMA將磁盤數據拷貝到內核緩存后,CPU又將數據從內核緩存拷貝至用戶緩存,這時線程又從內核態切換為用戶態

3.這時候知道了數據應該往哪里寫,CPU將數據從用戶緩存拷貝至socket緩存,線程又從用戶態切換到內核態

4.最后DMA將數據從內核緩存拷貝到網卡,read()調用結束返回,線程又從內核態切換到用戶態

整個過程線程上下文切換了四次,一共有四次拷貝,2次CPU來的,2次DMA來的。觀察圖不經會想,為啥數據要在用戶空間走一趟呢,能不能在內核空間直接從內核緩存到socket緩存呢,答案是可以的,這就是第一種零拷貝技術的原理,即mmap+write,先上圖:

圖片

mmap即內存映射,mmap()是由unix/linux操作系統來調用的,它可以將內核緩存中的一塊區域與用戶緩存中的一塊區域形成映射關系,即共享內存,不過在用戶緩存中的這塊映射區域是堆外內存。建立映射關系后,理解起來就是往其中任意一頭寫另外一頭也寫進去了,這樣是為了省掉一次CPU拷貝,傳統IO要把數據從內核緩存拷貝到用戶緩存才能寫,現在直接在用戶緩存寫,有了映射關系,對應的那塊內核緩存也有了。mmap+write實現的零拷貝流程是這樣的:

1.用戶進程要讀一個磁盤文件,告訴內核進程發起mmap()函數調用,來來來把你的內核緩存和我的一塊用戶緩存建立下映射關系,我要讀這個磁盤文件了。

2.內核進程乖乖調用了mmap()函數,將一塊內核緩存和用戶緩存中的一塊堆外內存建立的映射關系。并且告訴DMA將這個文件中的數據拷貝到了這塊內核緩存中。到這里mmap()函數就調用結束了,任務完成。嚴格的說到這里為止都不算IO過程,因此也沒有統計線程的上下文切換次數。

3.這才開始IO,因為磁盤文件已經被DMA拷貝到內核緩存中去了,又被映射到了這塊堆外內存,所以就直接在用戶緩存里就讀到了,線程沒有上下文切換,然后準備寫進一塊socket緩存里去了,線程發起了write()調用,狀態由用戶態切換為內核態,這時候內核基于CPU拷貝將數據從那塊映射著的內核緩存拷貝到socket緩存,CPU也就拷貝了這一次。

4.然后又是DMA將數據從socket緩存拷貝到網卡,最后write()函數調用返回,線程從內核態切換到用戶態。

整個過程線程切換了兩次,一共有三次拷貝,其中2次DMA拷貝,1次CPU拷貝。到這里CPU已經輕松不少了,就拷貝了一次嘛,可以不是說好的零拷貝的嘛,怎么還有一次拷貝,然后sendfile()函數就登場了,它是實實在在的實現了零拷貝,先上圖:

圖片

sendfile()也是操作系統來調用的,用戶線程只能通過特定的方法發起調用,比如java.nio包下的FileChannel,它的transferTo()方法可以發起sendfile()函數的調用。sendfile()函數實現零拷貝的過程是這樣的:

1.用戶線程發起sendfile()函數調用,與mmap()函數不同的是,不單單告訴內核去哪里讀數據,往哪里寫數據也一起告訴內核了。這時候就已經開始算IO了,線程從用戶態切換到了內核態。

2.知道了從哪里讀數據,依然是DMA去磁盤里把數據拷貝到內核緩存中去,由于同時也知道了應該往哪里寫數據,那就接著干活唄。

3.先把數據描述信息從內核緩存復制到指定的socket緩存,然后DMA又來了,這個時候socket緩存中的數據描述信息就起作用了,這些描述信息主要是數據的位置信息等。DMA Gather通過這些數據描述信息將數據從內核緩存拷貝到網卡。

4.sendfile()函數調用結束,線程從內核態切換到了用戶態,CPU一次拷貝都沒有!零!

這就是真正的零拷貝,整個過程用戶線程切換了兩次,只有兩次拷貝,但都是DMA來的。

關于第三種零拷貝方式,這是Linux2.4對sendfile做了改進之后的零拷貝。其實linux 2.1 內核開始就引入了sendfile()函數,當時的零拷貝是這樣的。

圖片

可以看出整個過程用戶線程切換了兩次,有三次拷貝,兩次DMA來的,還是有一次CPU拷貝。這種零拷貝方式和mmap+write方式有點類似,但是這也算零拷貝演進過程中的一環。

sendfile()函數的man page里面有這句話: In Linux kernels before 2.6.33, out_fd must refer to a socket. Since Linux 2.6.33 it can be any file. 也就是說Linux2.6.33之前sendfile()只能用于文件到socket的傳輸。而Linux2.6.33之后可以用于兩個文件描述符之間和文件到socket之間的傳輸。

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

    關注

    0

    文章

    461

    瀏覽量

    39374
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10905

    瀏覽量

    213030
  • 數據
    +關注

    關注

    8

    文章

    7145

    瀏覽量

    89584
收藏 人收藏

    評論

    相關推薦

    深度解析Linux中拷貝原理

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

    利用PLD實現智能演化計算

    演化計算是一種通過模擬的自然界的生物演化過程搜索最優解的方法,主要包括遺傳算法(CA)、演化策略(ES)、演化規劃(EP)等。演化計算具有子
    發表于 06-26 17:43 ?24次下載

    RAID中拷貝技術研究

    從實際測試和理論分析角度出發,研究了采用拷貝技術對提高RAID性能的重要性.研究結果表明拷貝技術對RAID性能有很大影響,尤其是在嵌入式環境下,必須采用
    發表于 07-01 17:09 ?20次下載

    基礎學習LEBVIEW】06 IO接口

    基礎學習LEBVIEW】06 IO接口,感興趣的朋友一定要學習。
    發表于 12-31 10:28 ?0次下載

    用于時鐘的動態演化模型及算法

    傳統分布仿真系統時鐘不一致影響因素分析方法,已不能滿足當前面向服務分布仿真的時鐘狀態分析需要。從系統全局時鐘演化出發,闡述了時鐘狀態演化內涵與過程;在此基礎上,基于有限自動機理論,提出
    發表于 11-22 10:34 ?9次下載
    用于時鐘的動態<b class='flag-5'>演化</b>模型及算法

    基于微博文本的詞對主題演化模型

    針對傳統主題模型忽略了微博短文本和文本動態演化的問題,提出了基于微博文本的詞對主題演化( BToT)模型,并根據所提模型對數據集進行主題演化分析。BToT模型在文本生成
    發表于 12-03 11:31 ?14次下載
    基于微博文本的詞對主題<b class='flag-5'>演化</b>模型

    相場模擬—盡“顯”增材制造過程中的晶粒演化

    (powder-bed-fusion, PBF)技術是最常用的AM技術之一。理解并預測PBF過程中晶粒演化對通過調整工藝以定制樣件的晶粒結構具有重要的指導意義。 目前,通過數值模擬方法(如元胞自動機法、相場法)可以很好地模擬PBF過程
    的頭像 發表于 06-15 15:06 ?2027次閱讀

    深入理解Linux系統拷貝技術

    內存拷貝是比較耗時操作,拷貝是常用優化手段,今天分享的文章就是Linux系統拷貝技術,Kafka和MySQL開源組件都用到這個核心技術,
    的頭像 發表于 09-01 15:12 ?3106次閱讀

    詳解Linux系統中的拷貝技術

    Linux系統中一切皆文件,仔細想一下Linux系統的很多活動無外乎讀操作和寫操作,拷貝就是為了提高讀寫性能而出現的。
    的頭像 發表于 05-18 09:18 ?2403次閱讀
    詳解Linux系統中的<b class='flag-5'>零</b><b class='flag-5'>拷貝</b>技術

    C++深拷貝和淺拷貝詳解

    當類的函數成員存在指針成員時會產生深拷貝和淺拷貝和問題。
    發表于 08-21 15:05 ?360次閱讀
    C++深<b class='flag-5'>拷貝</b>和淺<b class='flag-5'>拷貝</b>詳解

    信號驅動IO與異步IO的區別

    , 是開始處理IO, 這個時候還是存在阻塞的,將數據從內核態拷貝進入到用戶態的過程至少是阻塞住的 (應用程序將數據從內核態拷貝到用戶態的過程
    的頭像 發表于 11-08 15:32 ?1135次閱讀
    信號驅動<b class='flag-5'>IO</b>與異步<b class='flag-5'>IO</b>的區別

    什么是拷貝技術

    傳統操作系統的數據傳輸過程中,系統內部會在磁盤、內存、緩存中多次進行數據拷貝,每次都會占用CPU的資源,數據量小的時候還好。 隨著數據量的增加,CPU的開銷也會持續增加,尤其是在機器人圖像數據
    的頭像 發表于 11-27 16:20 ?495次閱讀
    什么是<b class='flag-5'>零</b><b class='flag-5'>拷貝</b>技術

    如何進行拷貝性能測試

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

    磁盤拷貝機會拷貝刪除的內容嗎

    升級等方面非常有用。 然而,關于磁盤拷貝機是否會拷貝已刪除的內容,這取決于拷貝過程中使用的具體方法和工具。以下是對這個問題的分析: 磁盤空間的分配與管理 在深入了解磁盤
    的頭像 發表于 10-14 15:38 ?601次閱讀

    批量音頻檔案拷貝最佳方案:解決播放錯誤與拷貝不完全問題

    本文討論了在數字化時代,專業SD拷貝機在批量拷貝音頻檔案MicroSD卡中的應用優勢。相較于傳統計算機拷貝,SD
    的頭像 發表于 11-23 16:12 ?217次閱讀
    批量音頻檔案<b class='flag-5'>拷貝</b>最佳方案:解決播放錯誤與<b class='flag-5'>拷貝</b>不完全問題
    六合彩开奖号码| 24山向阴阳图| 大发888信誉net| 百家乐官网技术辅助软件| 全讯网开奖直播| 百家乐官网扎金花斗地主| 大发888下载删除| 网上百家乐骗人| 百家乐官网扑克玩法| 百乐坊百家乐娱乐城| 百家乐官网龙虎的投注法| 百家乐专用| 百家乐官网扫描技术| 现金网制作| 百家乐官网路珠价格 | 宿松县| 百家乐l路单| 百家乐官网是骗人的| 澳门百家乐娱乐场开户注册| 百家乐官网网上投注代理商| 大发888娱乐城在线客服| 在线玩百家乐官网的玩法技巧和规则 | 金川县| 金世豪百家乐的玩法技巧和规则| 网络百家乐官网免费试玩| 威尼斯人娱乐场官网网站是多少| 百家乐官网发牌规| 新田县| fl水果机教程| 澳门百家乐网址| 百家乐官网最新庄闲投注法 | 百家乐官网方法技巧| 百家乐讲谈| 百家乐官网娱乐优惠| 联博娱乐| 木棉百家乐网络| 迪士尼百家乐官网的玩法技巧和规则| 色中色最新网址| 网上百家乐乐代理| 太阳百家乐官网网址| 松溪县|