零拷貝的原理

一、傳統數據拷貝方式
在這裏插入圖片描述
①一個read系統調用後,DMA執行了一次數據拷貝,從磁盤到內核空間
②read結束後,發生第二次數據拷貝,由cpu將數據從內核空間拷貝至用戶空間
③send系統調用,cpu發生第三次數據拷貝,由cpu將數據從用戶空間拷貝至內核空間(socket緩衝區)
④send系統調用結束後,DMA執行第四次數據拷貝,將數據從內核拷貝至協議引擎
⑤另外,這四個過程中,每個過程都發生一次上下文切換

二、零拷貝-sendfile 對應到java中
FileChannel.transferTo(long position, long count, WritableByteChannel target)//將數據從文件通道傳輸到了給定的可寫字節通道
在這裏插入圖片描述

①DMA從拷貝至內核緩衝區
②cpu將數據從內核緩衝區拷貝至內核空間(socket緩衝區)
③DMA將數據從內核拷貝至協議引擎
④這三個過程中共發生2次上下文切換,分別爲發起讀取文件和發送數據

以上過程發生了三次數據拷貝,其中有一次爲cpu完成

三、linux內核2.4以後,socket緩衝區做了調整,DMA帶收集功能,如下圖:

在這裏插入圖片描述
①DMA從拷貝至內核緩衝區
②將數據的位置和長度的信息的描述符增加至內核空間(socket緩衝區)
③DMA將數據從內核拷貝至協議引擎

零拷貝-mmap 對應到java中
MappedByteBuffer//文件內存映射
數據不會複製到用戶空間,只在內核空間,與sendfile類似,但是應用程序可以直接操作該內存。——

————————————
版權聲明:本文爲CSDN博主「EvanKevin」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u013018618/article/details/80146617

發佈了18 篇原創文章 · 獲贊 4 · 訪問量 5624
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章