目前大部分佇列伺服器、web伺服器以及java裡面的nio、Netty等等服務底層的通訊無不用到零複製技術。而零複製技術的底層實現便是核心提供的高階IO函式。比如kafka的零複製就是複用此類高階IO函式如:mmap、 sendfile、 splice等。
linux 高階I/O函式主要針對核心模組實現。在特定的場景下效能卓越。這些函式大致分為三大類:
建立檔案描述符: pipe 、dup 、 dup2讀寫資料: readv / writev、 sendfile 、mmap/munmap、splice 、tee控制I/O行為和屬性: fcntlpipe建立一個管道實現程序間通訊
dup / dup2標準輸入/輸出重定向到一個檔案或者一個網路連線(CGI)。
readv / writevreadv 即將資料從檔案描述符讀至分散的記憶體塊中——分散讀
writev 將多塊分散的記憶體資料一併寫入檔案描述符中——集中寫
sendfile 函式在兩個檔案描述符中直接傳遞資料(核心實現)避免核心緩衝區與使用者緩衝區之間的資料複製——零複製
sendfile 資料傳輸
mmap / munmapmmap 申請一個記憶體空間用作程序間通訊的共享記憶體
munmap 釋放記憶體
splice 函式在兩個檔案描述符之間移動資料 —— 零複製操作
tee 函式在兩個管道檔案描述符中進行資料提製。——零複製
fcntl 函式提供對檔案描述符各種控制操作。
Q&A 什麼是零複製?
零複製就是一種避免cpu將資料從一塊儲存複製至另外一塊儲存的技術。 可以概括以下幾種場景:
1. 避免系統核心緩衝區之間的資料複製
2. 避免核心與使用者緩衝區之間資料複製
3. 避開系統直接訪問硬體
4. 避免不必要的系統呼叫以及上下檔案切換
最新評論