目錄

通過 CompositeByteBuf 實現(xiàn)零拷貝
通過 wrap 操作實現(xiàn)零拷貝
通過 slice 操作實現(xiàn)零拷貝
通過 FileRegion 實現(xiàn)零拷貝

此文章已同步發(fā)布在我的 segmentfault 專欄.

根據(jù) Wiki 對 Zero-copy 的定義:

"Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. This is frequently used to save CPU cycles and memory bandwidth when transmitting a file over a network.

即所謂的 Zero-copy, 就是在操作數(shù)據(jù)時, 不需要將數(shù)據(jù) buffer 從一個內(nèi)存區(qū)域拷貝到另一個內(nèi)存區(qū)域. 因為少了一次內(nèi)存的拷貝, 因此 CPU 的效率就得到的提升.

在 OS 層面上的 Zero-copy 通常指避免在 用戶態(tài)(User-space) 與 內(nèi)核態(tài)(Kernel-space) 之間來回拷貝數(shù)據(jù). 例如 Linux 提供的 mmap 系統(tǒng)調(diào)用, 它可以將一段用戶空間內(nèi)存映射到內(nèi)核空間, 當(dāng)映射成功后, 用戶對這段內(nèi)存區(qū)域的修改可以直接反映到內(nèi)核空間; 同樣地, 內(nèi)核空間對這段區(qū)域的修改也直接反映用戶空間. 正因為有這樣的映射關(guān)系, 我們就不需要在 用戶態(tài)(User-space) 與 內(nèi)核態(tài)(Kernel-space) 之間拷貝數(shù)據(jù), 提高了數(shù)據(jù)傳輸?shù)男?

而需要注意的是, Netty 中的 Zero-copy 與上面我們所提到到 OS 層面上的 Zero-copy 不太一樣, Netty的 Zero-coyp完全是在用戶態(tài)(Java 層面)的, 它的 Zero-copy 的更多的是偏向于 優(yōu)化數(shù)據(jù)操作 

網(wǎng)友評論