ZeroCopy高性能零拷貝(DMA)

      操作系統的核心是內核,獨立於分內核應用程序,可以訪問受保護的內存空間,也可以訪問底層硬件設備。
爲了避免用戶進程直接操作內核,保證內核安全,操作系統將虛擬內存劃分爲兩部分,一部分是內核空間(Kernel-space),一部分是用戶空間(User-space)。在傳統文件讀取流程中,數據信息需要經過用戶空間之後才能在底層設備之間進行轉換(比如磁盤與磁盤之間,網卡與網卡之間,磁盤與網卡,網卡與磁盤等)。

 以文件發送流程爲例, 傳統的將一個file讀取併發送出去會經歷4個過程。
 read時將文件讀取到用戶空間:
  1. 將文件從磁盤copy到kernel(內核)態
  2. cpu將kernrl態的數據copy到user(用戶)態
 write時將用戶空間寫入到網卡:
  3. user態的內容會copy到kernel態的socket的buffer中
  4. 將kernel中buffer的數據copy到網卡中傳送
第2.3步中數據在用戶態和內核態之間進行切換,雖然保證了內核系統的安全,實際上從性能上來說,也造成了額外的性能開銷。

零拷貝技術優化了用戶態,整個數據傳輸操作在一個DMA控制器的控制下進行的。CPU除了在數據傳輸開始和結束時做一點處理外(開始和結束時候要做中斷處理),在傳輸過程中 CPU 可以繼續進行其他的工作。

零拷貝技術有mmap及sendfile,sendfile主要用於大文件傳輸,mmap主要用於小文件傳輸。不僅拷貝的次數變成了3次,上下文切換的次數也減少到了2次,效率比傳統方式高了很多。rocketmq就是以mmap+write方式實現的。

備註:
DMA : 直接內存存取(Direct Memory Access),是一種允許外圍設備(硬件子系統)直接訪問系統主內存的機制。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章