網絡傳輸中的buffer以及DMA傳輸

一.存在的緩衝區:

  1. 用戶態自定義的緩衝區;
  2. 內核(TCP/IP)維護的緩衝區:send buffer 和 recv buffer ,統稱爲socket buffer.

二.用戶數據發送與接收過程:

在這裏插入圖片描述

發送過程:

假如需要將磁盤上的數據發送給網絡上的其他用戶,需要經歷這幾個過程:

  1. 首先會經歷一系列的系統調用將數據加載到內核的緩衝區,然後將數據再拷貝到用戶空間緩衝區;
可不可以直接將數據從硬盤拷貝到用戶空間呢?

可以,有些程序或者提高效率和性能,會實現“內核旁路”功能,
避過內核參與,直接在磁盤與用戶緩衝區進行數據的傳輸,多數情況爲了穩定,還是走正常流程吧。
  1. 當數據在用戶空間操作完之後,會調用send等系統調用,將數據從用戶空間拷貝到TCP的接收緩衝區;
  2. 最後一般在將數據從內核通過DMA技術將數據發送給網卡,因爲此時數據不用我們進行計算修改之類的操作,直接進行拷貝即可,所以用DMA。
內核常駐內存,所以內核空間數據一定在內存上,內存和網卡都屬於高速設備,
使用DMA傳輸再好不過了!

接收過程:

  1. 數據經歷物理層到達網卡,一般也是通過DMA技術將數據傳輸到內核緩衝區,也就是TCP的接收緩衝區;
  2. 然後用戶調用read()/recv()等系統調用將數據從內核緩衝區讀取到用戶自己定義的緩存區中。

三.DMA技術 :Direct Memory Access直接內存存取

DMA 傳輸將數據從一個地址空間複製到另外一個地址空間。

當CPU 初始化這個傳輸動作,傳輸動作本身是由 DMA 控制器來實行和完成,
也就是說除了初始化的時候需要cpu工作,傳輸的過程是脫離CPU的,是不需要CPU工作的。

典型的例子就是上面說到的內存與網卡等設備之間的傳輸

與普通的數據拷貝相比:
普通數據的拷貝需要經過cpu,而DMA數據的傳輸過程中不需要經過cpu。
像是這樣的操作並沒有讓處理器工作拖延,反而可以被重新排程去處理其他的工作。

講到這裏,在提一個linux中文件傳輸性能比較高的函數sendfile().

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