【Linux編程】大冒險之零拷貝技術探究

原文: https://blog.csdn.net/lk_wkqd/article/details/50242523

對于網絡數據傳輸或I/O數據拷貝而言,零拷貝技術主要指的是避免內核緩沖區和用戶緩沖區中的不必要的數據拷貝操作。

Linux傳統I/O

Linux傳統I/O操作是一種緩沖I/O,在數據傳輸中,操作系統會將 I/O 的數據緩存在文件系統的頁緩存中,即操作系統內核緩沖區中。
比如:在網絡中傳輸一個文件時,發送端應用程序會先檢查內核緩沖區中有沒有需要發送的這個文件的數據,如果沒有,則會將這個文件從磁盤拷貝到內核緩沖區中,然后再從內核緩沖區拷貝到應用程序的用戶緩沖區,如果應用程序不對數據進行處理或處理完畢之后,再將文件拷貝到內核中的socket發送緩沖區(比如TCP發送緩沖區),待內核socket緩沖區中有足夠的數據時,就會把數據發送到網卡上,然后在網絡上進行傳輸。其數據傳輸過程如下圖所示:

這里寫圖片描述

其過程至少發生了四次數據的拷貝,其頻繁的讀寫對CPU的使用和內存的帶寬開銷是非常大的。

零拷貝技術

零拷貝技術相對傳統I/O技術來說,主要是避免數據傳輸過程中頻繁的數據拷貝操作,提高傳輸效率,并且使CPU有更多時間執行其它任務。

零拷貝技術分類

  • 直接I/O機制:

通過上面的介紹,普通I/O(即緩沖I/O)會被內核緩存。相對于普通I/O機制,直接I/O機制對文件的訪問不經過內核的緩存,數據直接在磁盤和應用程序地址空間進行傳輸。這就避免了內核緩沖區和用戶緩沖區的數據拷貝,降低了讀寫操作對CPU的使用以及對內存帶寬的占用。
但是直接 I/O 不能提供緩存 I/O 的優勢。緩存 I/O 的讀操作可以從高速緩沖存儲器中快速獲取數據,而直接 I/O 的讀數據操作會造成磁盤的同步讀,導致進程需要較長的時間才能執行完。

  • 不經過用戶緩沖區

主要是指不需要將數據拷貝或者映射到應用程序地址空間中,直接在內核中傳輸。
比如sendfile( )系統調用:sendfile( ) 系統調用利用 DMA 將文件中的數據拷貝到操作系統內核緩沖區中,然后數據被拷貝到與 socket 相關的內核緩沖區中。接下來,DMA 將數據從內核 socket 緩沖區中拷貝到網卡中去。如果在用戶調用 sendfile ( ) 系統調用進行數據傳輸的過程中有其他進程截斷了該文件,那么 sendfile ( ) 系統調用會簡單地返回給用戶應用程序中斷前所傳輸的字節數,errno 會被設置為 success。
其傳輸過程如下:

這里寫圖片描述

由于sendfile( )函數只能往socket上寫數據,因此它幾乎是專門為了在網絡上傳輸文件而設計的。

DMA簡介:Direct Memory Access(存儲器直接訪問)。這是指一種高速的數據傳輸操作,允許在外部設備和存儲器之間直接讀寫數據,既不通過CPU,也不需要CPU干預。整個數據傳輸操作在一個稱為”DMA控制器”的控制下進行的。CPU除了在數據傳輸開始和結束時做一點處理外,在傳輸過程中CPU可以進行其他的工作。這樣,在大部分時間里,CPU和輸入輸出都處于并行操作。因此,使整個計算機系統的效率大大提高。

  • 優化數據在內核緩沖區和用戶緩沖區之間的傳輸

保留了傳統的在用戶應用程序地址空間和操作系統內核地址空間之間傳遞數據的技術,但卻在傳輸上進行優化。
比如寫時復制技術:如果多個應用程序同時訪問同一塊數據,但這塊數據只有一份,那么可以為這些應用程序分配指向這塊數據的指針,在每一個應用程序看來,它們都擁有這塊數據的一份數據拷貝。若一個應用程序需要訪問但不修改該數據時,直接讀這個數據而不復制,但當應用程序需要對這塊數據進行修改的時候,就需要將數據真正地拷貝到該應用程序的地址空間中去,也就是說,該應用程序擁有了一份真正的私有數據拷貝,對這份私有數據進行修改。這樣做是為了避免該應用程序對這塊數據做的更改被其他應用程序看到。這個過程對于應用程序來說是透明的,如果應用程序永遠不會對所訪問的這塊數據進行任何更改,那么就永遠不需要將數據拷貝到應用程序自己的地址空間中去。

以上只進行了比較淺的分析,知識有限,找了一些深入的資料沒有看懂,比如其實現機理,等需要對Linux內核深入學習的時候在回頭看,不過暫時理解這些對于網絡編程已經有很大的幫助了。

相關資料
Linux 中的零拷貝技術第 1 部分
Linux 中的零拷貝技術第 2 部分

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • 什么是零拷貝 維基上是這么描述零拷貝的:零拷貝描述的是CPU不執行拷貝數據從一個存儲區域到另一個存儲區域的任務,這...
    tomas家的小撥浪鼓閱讀 25,288評論 11 61
  • 本文探討Linux中主要的幾種零拷貝技術以及零拷貝技術適用的場景。為了迅速建立起零拷貝的概念,我們拿一個常用的場景...
    卡巴拉的樹閱讀 65,513評論 13 112
  • 十七歲那年,我戀愛了。這是因為一直印象不錯的男生成了我的同桌。 一開始只是聊的來,漸漸的成了好哥們兒,現在想來,我...
    貝莉爾de璞玉為石閱讀 142評論 0 0
  • Rx,不管你是JS,Java,Python還是Swift,玩的就是操作符。每個操作符怎么用,官方文檔寫得不能再清楚...
    du1dume閱讀 14,509評論 1 15
  • 人常言“讀萬卷書不如行萬里路,行萬里路不如高人指路”,雖然這句話幾乎所有人都耳熟能詳,包括我自己,可是我卻并沒有意...
    今天安好閱讀 448評論 0 0