從read函數到零拷貝

操作系統分爲“用戶態”和“內核態”,文件操作、網絡
操作需要涉及這兩種形態的切換,免不了進行數據複製,一臺服務器把本機磁 盤文件的內容發送到客戶端 一般分爲兩個步驟:
1 ) read(file, tmp buf, len);,讀取本地文件內容;
2) write(socket, tmp_buf, len);,,將讀取的內容通過網絡發送出去。
tmp_buf是預先申請的內存,這兩個看似簡單的操作,實際進行了 4 次數 據複製,分別是:從磁盤複製數據到內核態內存,從內核態內存複製到用戶 態內存(完成了 read(file, tmp_b叫 len));然後從用戶態內存複製到網絡驅動 的內核態內存,最後是從網絡驅動的內核態內存複製到網卡中進行傳輸(完成write(socket, tmp_buf, len)) 。


通過使用 mmap 的方式,可以省去向用戶態的內存複製,提高速度。 這 種機制在 Java 中是通過 MappedByteBuffer 實現的,具體可以參考 Java 7 的文 檔: https:// docs.oracle.com/j avase/7 I docs/api/j ava/nio/MappedByteBuffer.html。 RocketMQ 充分利用了上述特性,也就是所謂的“零拷貝”技術,提高消息存 盤和網絡發送的速度。
 

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