一.存在的緩衝區:
- 用戶態自定義的緩衝區;
- 內核(TCP/IP)維護的緩衝區:send buffer 和 recv buffer ,統稱爲socket buffer.
二.用戶數據發送與接收過程:
發送過程:
假如需要將磁盤上的數據發送給網絡上的其他用戶,需要經歷這幾個過程:
- 首先會經歷一系列的系統調用將數據加載到內核的緩衝區,然後將數據再拷貝到用戶空間緩衝區;
可不可以直接將數據從硬盤拷貝到用戶空間呢?
可以,有些程序或者提高效率和性能,會實現“內核旁路”功能,
避過內核參與,直接在磁盤與用戶緩衝區進行數據的傳輸,多數情況爲了穩定,還是走正常流程吧。
- 當數據在用戶空間操作完之後,會調用send等系統調用,將數據從用戶空間拷貝到TCP的接收緩衝區;
- 最後一般在將數據從內核通過DMA技術將數據發送給網卡,因爲此時數據不用我們進行計算修改之類的操作,直接進行拷貝即可,所以用DMA。
內核常駐內存,所以內核空間數據一定在內存上,內存和網卡都屬於高速設備,
使用DMA傳輸再好不過了!
接收過程:
- 數據經歷物理層到達網卡,一般也是通過DMA技術將數據傳輸到內核緩衝區,也就是TCP的接收緩衝區;
- 然後用戶調用read()/recv()等系統調用將數據從內核緩衝區讀取到用戶自己定義的緩存區中。
三.DMA技術 :Direct Memory Access直接內存存取
DMA 傳輸將數據從一個地址空間複製到另外一個地址空間。
當CPU 初始化這個傳輸動作,傳輸動作本身是由 DMA 控制器來實行和完成,
也就是說除了初始化的時候需要cpu工作,傳輸的過程是脫離CPU的,是不需要CPU工作的。
典型的例子就是上面說到的內存與網卡等設備之間的傳輸
與普通的數據拷貝相比:
普通數據的拷貝需要經過cpu,而DMA數據的傳輸過程中不需要經過cpu。
像是這樣的操作並沒有讓處理器工作拖延,反而可以被重新排程去處理其他的工作。
講到這裏,在提一個linux中文件傳輸性能比較高的函數sendfile().