首頁>技術>

目前大部分佇列伺服器、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 / writev

readv 即將資料從檔案描述符讀至分散的記憶體塊中——分散讀

writev 將多塊分散的記憶體資料一併寫入檔案描述符中——集中寫

sendfile 函式

在兩個檔案描述符中直接傳遞資料(核心實現)避免核心緩衝區與使用者緩衝區之間的資料複製——零複製

sendfile 資料傳輸

mmap / munmap

mmap 申請一個記憶體空間用作程序間通訊的共享記憶體

munmap 釋放記憶體

splice 函式

在兩個檔案描述符之間移動資料 —— 零複製操作

tee 函式

在兩個管道檔案描述符中進行資料提製。——零複製

fcntl 函式

提供對檔案描述符各種控制操作。

Q&A 什麼是零複製?

零複製就是一種避免cpu將資料從一塊儲存複製至另外一塊儲存的技術。 可以概括以下幾種場景:

1. 避免系統核心緩衝區之間的資料複製

2. 避免核心與使用者緩衝區之間資料複製

3. 避開系統直接訪問硬體

4. 避免不必要的系統呼叫以及上下檔案切換

15
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • leetcode861_go_翻轉矩陣後的得分