零拷貝(zerocopy)三張圖

核心概念:linux

用戶空間+內核空間+磁盤硬件網絡

1.最原始的BIO場景下IO操做流程。併發

讀取磁盤上的文件,而後通過網絡,將文件發送到另一個磁盤的過程。4次上下文切換,2次文件複製。操作系統

一、JVM發出read() 系統調用。
二、OS上下文切換到內核模式(第一次上下文切換)並將數據讀取到內核空間緩衝區。(第一次拷貝:hardware ----> kernel buffer)
三、OS內核而後將數據複製到用戶空間緩衝區(第二次拷貝: kernel buffer --> user buffer),而後read系統調用返回。而系統調用的返回又會致使一次內核空間到用戶空間的上下文切換(第二次上下文切換)。
四、JVM處理代碼邏輯併發送write()系統調用。
五、OS上下文切換到內核模式(第三次上下文切換)並從用戶空間緩衝區複製數據到內核空間緩衝區(第三次拷貝: user buffer ——> kernel buffer)。
六、write系統調用返回,致使內核空間到用戶空間的再次上下文切換(第四次上下文切換)。將內核空間緩衝區中的數據寫到hardware(第四次拷貝: kernel buffer ——> hardware)。blog

  • 總的來講,傳統的I/O操做進行了4次用戶空間與內核空間的上下文切換,以及4次數據拷貝。顯然在這個用例中,從內核空間到用戶空間內存的複製是徹底沒必要要的,由於除了將數據轉儲到不一樣的buffer以外,咱們沒有作任何其餘的事情。因此,咱們能不能直接從hardware讀取數據到kernel buffer後,再從kernel buffer寫到目標地點不就行了。爲了解決這種沒必要要的數據複製,操做系統出現了零拷貝的概念。注意,不一樣的操做系統對零拷貝的實現各不相同。在這裏咱們介紹linux下的零拷貝實現。

2.除去了用戶空間和內核空間的文件複製。內存

 

3.DMAit

相關文章
相關標籤/搜索