傳統IO拷貝與零拷貝技術比較


1. 傳統IO

由上面圖知,傳統io需要經過4次copy, 3次狀態切換

第一次: 從硬盤 經過 DMA 拷貝 到 kernel buffer (內核buferr)

第二次: 從kernel buffer 經過cpu 拷貝到 user buffer ,比如拷貝到應用程序

第三次: 從user buffer 拷貝到 socket buffer 

第四次: 從socket buffer 拷貝到 protocol engine 協議棧

 

第一次狀態切換: 用戶態---》 內核狀 (或者叫着 用戶上下文----》 內核上下文)

第二次狀態切換: 內核狀---》 用戶狀

第三次狀態切換: 用戶狀---》 內核狀

 

DMA : direct memory access  直接內存拷貝

 

2. mmap優化

 

mmap : 通過內存映射 ,將文件映射到內核緩沖區,同時用戶空間可以共享內核空間的數據。這樣在網絡傳輸時就減少了內核空間到用戶空間的拷貝次數

 

第一次拷貝: DMA拷貝,從硬件拷貝到內核空間

因為user buffer 與kernel buffer共享數據 ,所以不需要將數據從kernel buffer 拷貝到 user buffer , 數據可以直接在內核空間修改

第二次拷貝: kernel buffer 中的數據經過 cpu 拷貝到 socket buffer 

第三次拷貝: socket buffer 過DMA拷貝到protocol engine 

 

所以 mmp優化之后,拷貝共需要3次, 但是狀態 切換還是3次

 

3. sendFile優化

Linux2.4 提供的sendFile實現了真正的零拷貝

 

第一次拷貝: DMA拷貝,將數據從硬盤拷貝到kernel buffer 

第二次拷貝: DMA拷貝,將數據從kernel buffer拷貝到protocol engine

沒有經過cpu拷貝,也就是操作系統級別的拷貝,實現了真正的零拷貝

 

注意: sendFile技術還是有少量的數據(例如數據的大小,偏移量等)使用了cpu拷貝,從kernel buffer 拷貝到 socket buffer ,但是數據量很少,可忽略 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM