當前位置:編程學習大全網 - 遊戲軟體 - Netty中的零拷貝是怎麽實現的?

Netty中的零拷貝是怎麽實現的?

Netty是Java語言中壹個高性能的網絡通信框架,零拷貝又是這個框架的特色之壹,它是如何實現的呢?

在計算機中完成壹次數據傳輸,壹般需要經過兩個階段。第壹步,操作系統把數據從本地硬盤或網卡拷貝到內核空間的內存;第二步,應用程序再把數據從系統內核空間的內存拷貝到用戶空間的內存;接下來才是應用程序中的數據處理工作。

先來看幾個名詞。

DMA(Direct Memory Access)直接存儲器訪問,將數據從壹個地址空間復制到另壹個地址空間。當CPU初始化這個傳輸動作後,傳輸動作本身是由DMA控制器(DMAC)來完成的。也就是說在數據傳輸期間,系統可以並行執行其他任務。CPU拷貝,是由CPU直接處理的數據的傳送,數據拷貝時壹直占用CPU資源。

從上圖中可以看出,傳統的IO讀寫流程,包括4次用戶態和內核態的切換,4次上下文切換,4次的數據拷貝,2次CPU拷貝,2次DMA拷貝。

壹、什麽是零拷貝?

拷貝,是指數據從壹個存儲區域復制到另壹個存儲區域。 零,表示次數為0,復制的次數為0,也就是數據不需要從壹個存儲區域復制到另壹個存儲區域。

二、為什麽需要零拷貝?

零拷貝,就是指從系統內核空間的內存到用戶空間的內存,不需要采用傳統方式的數據復制。而是將系統內核空間的內存和用戶空間的內存實現關聯映射(mmap內存映射機制),從而省去了數據傳輸過程中的復制。

mmap(memory map)內存映射機制,簡單來說就是將文件/設備映射到內存中,進程可以通過讀寫內存的方式,實現對mmap文件的操作。零拷貝並不是完全沒有拷貝,而是減少了數據拷貝的次數。

三、零拷貝在Netty中的三種實現。

1.使用堆外內存,也叫直接內存(Direct Memory)。netty的接收和發生都是使用Direct buffer,對應系統底層的mmap機制,直接使用堆外內存進行Socket讀寫,不需要進行字節緩沖區的二次拷貝。

2.提供了組合buffer對象 (CompositeByteBuf),可以聚合多個ByteBuffer對象,用戶只需要像操作壹個ByteBuffer壹樣操作組合ByteBuffer,避免了傳統通過內存拷貝的方式將幾個buffer合並成壹個大buffer,不需要內存拷貝。

3.文件傳輸采用TransferTo方法,它可以直接將文件緩沖區的數據發送到目標channel,避免了傳統通過循環write方式導致的內存拷貝問題。

最後總結

通過整理可以發現,netty的零拷貝並不是完全不拷貝,而是減少了CPU拷貝,也就是數據從系統內核空間的內存到用戶空間內存的拷貝。DMA拷貝還是存在的,畢竟它是操作系統所做的事情,不屬於應用程序的操作範圍。在netty中,目前有三種方式實現的零拷貝。第壹種使用堆外內存。第二種,CompositeByteBuf組合buffer對象。第三種,文件傳輸采用TransferTo方法。

參考文檔: /s/HvdiDbkMMMcGhee5Dhq_Jw

  • 上一篇:小學生推薦壹本書作文450字五篇
  • 下一篇:電腦裏安裝著納米盤,為什麽點納米盤專用鏈接時,總是提示“您還沒有下載納米盤”呢?
  • copyright 2024編程學習大全網