什麼是零拷貝?一招學會高效傳輸檔案

2021-10-08 06:39:07 字數 2008 閱讀 1815

差一點我們就擦肩而過了

有趣有用

有態度

導學問題:

1.伺服器通過網路傳輸資料時,系統有幾次拷貝?

2.大檔案和小檔案各有什麼傳輸特點?

零拷貝(zero-copy)技術指在計算機執行操作時,cpu 不需要先將資料從乙個記憶體區域複製到另乙個記憶體區域,從而可以減少上下文切換以及 cpu 的拷貝時間。

某天你接到公司下發的乙個安排,完成乙個類似ftp檔案傳輸的功能,要求傳輸效率高,cpu占用低。典型的要馬兒跑得快又不給馬吃草。

最直接的方法:從網路請求中找出檔案在磁碟中的路徑後,如果這個檔案比較大,假設有 100mb,可以在記憶體中分配 10kb 的緩衝區,再把檔案分成一萬份,每份只有 10kb,這樣,從檔案的起始位置讀入10kb 到緩衝區,再通過網路 api 把這 10kb 傳送到客戶端。接著重複一萬次,直到把完整的檔案都傳送完畢。

示意圖如下:

這個方案做了 1 萬次記憶體拷貝,對 100mb 檔案拷貝的位元組數也翻了 4 倍,到了1000mb。cpu資源是多麼寶貴,要處理大量的任務,還要去拷貝大量的資料。無疑,過多的記憶體拷貝無謂地消耗了 cpu 資源。我們要想辦法降低上下文切換頻率和記憶體拷貝次數。

引入mmap技術,mmap可以實現使用者空間和核心空間資料共享,從而避免減少一次核心空間到使用者空間資料拷貝動作,在資料量很大的時候,效率提公升尤其明顯。

示意圖如下:

注意:這裡的零拷貝其實是根據核心狀態劃分的,在這裡沒有經過cpu的拷貝,資料在使用者態的狀態下,經歷了零次拷貝,所以才叫做零拷貝,但不是說不拷貝。所以現在核心依然依然會有一次從快取(pagecache)拷貝到socket緩衝區的過程。這裡我們能不能想辦法優化呢?

借助dma(direct memory access)直接記憶體訪問技術,可以幫助我們再減少一次cpu拷貝過程,它可以讓資料直接從快取傳輸給網絡卡,整個拷貝過程減小到了兩次。

示意圖如下:

在面臨高併發、大檔案的資料傳輸時,我們需要繞過 pagecache。linux系統下支援直接io,所謂直接io就是指點對點直接傳輸,沒有中間商賺差價,效能效率極高。通過直接io往往會搭配非同步io來應對高併發。

示意圖如下:

有了直接 io 後,非同步 io 就可以無阻塞地讀取檔案了。現在,大檔案由非同步 io 和直接 io 處理,小檔案則交由零拷貝處理,至於判斷檔案大小的閾值可以靈活配置。

ok,先到這裡。

●分享一款linux平台下的tcp協議棧!超級透徹!

●tcp本地套接字

●arp協議是什麼鬼?這一篇原始碼分析!

●我想靠自己載入個動態庫

覺得不錯,請點個在看

什麼是零拷貝

我們首先來認識一下傳統的i o操作。假如說使用者程序現在要把乙個檔案複製到另乙個地方。那麼使用者程式必須先把這個檔案讀入記憶體,然後再把記憶體裡的資料寫入另乙個檔案。不過檔案讀入記憶體也不是直接讀入使用者程序的記憶體,而是先讀入作業系統核心的記憶體,然後再從作業系統核心的記憶體區讀到使用者程序的記憶...

Google 是「只會一招的小馬」

bill gates 曾表示,google 的好日子即將結束。微軟為何持這一觀點?larry page 和 sergey brin 這兩位史丹福大學的學生於 1998 年建立了 google 現在 google 每年營收在 200 億美元以上。google 在搜尋引擎領域掀起了革命,迫使既定競爭對手...

春節6場相親,大神是如何一招擺脫尷尬?

春節假期餘額已不足,但是對於四川一縣城的小李來說,假期完了,自己也就解放了。為何?都是被相親逼的!這個春節,他一口氣相親了6場,如果不是假期完了,那麼就還有兩場,主要是時間緊任務重,講究個先來後到 小李北京某名牌大學畢業後回到四川,就職於成都天府軟體園某it企業,成了小縣城街坊鄰居眼裡的 別人家的孩...