(5)零拷貝實(shí)現(xiàn)原理

場景:文件讀出數(shù)據(jù),到另一臺服務(wù)器上

偽代碼? File.read(file, buf, len);? ? Socket.send(socket, buf, len);? ?4次數(shù)據(jù)拷貝,用戶態(tài)和內(nèi)核態(tài)區(qū)別

1、read()一次上下文切換用戶態(tài)->內(nèi)核態(tài)),底層用DMA(direct memory access)讀磁盤文件,存儲到內(nèi)核地址空間讀取緩存區(qū)

2、程序無法訪問內(nèi)核地址空間數(shù)據(jù),從讀取拷貝到用戶緩沖區(qū)。第二次切換(內(nèi)核態(tài)->用戶態(tài)),可修改數(shù)據(jù)。

3、終目通過Socket傳到另一個服務(wù),send()第三次切換(用戶態(tài)->內(nèi)核態(tài)),緩沖區(qū)與目標(biāo)套接字相關(guān)聯(lián),與讀取緩沖區(qū)無關(guān)。

4、send()返回,第四次切換,DMA把數(shù)據(jù)從目標(biāo)套接字相關(guān)的緩存區(qū)傳到協(xié)議引擎進(jìn)行發(fā)送。

1和4是由DMA負(fù)責(zé),不會消耗CPU,只有過程2和3的拷貝需要CPU參與

好幾次拷貝多余,影響性能

一、零拷貝優(yōu)化

不需要操作內(nèi)容,2和3多余,直接把內(nèi)核態(tài)讀取緩存沖區(qū)數(shù)據(jù)直接拷貝到套接字相關(guān)的緩存區(qū)

切換四次減到兩次,拷貝四次減到三(其中DMA copy 2次,CPU copy 1次)

FileChannel的transferTo() 可以實(shí)現(xiàn),數(shù)據(jù)從文件通道傳輸?shù)浇o定可寫字節(jié)通道, file.read()和socket.send()替換為transferTo()調(diào)用"

public void transferTo(long position, long count, WritableByteChannel target);

不是零拷貝(一次cpu)

二、零拷貝實(shí)現(xiàn)

1、transferTo()DMA 將文件拷貝到內(nèi)核讀取緩沖區(qū)。

2、避免內(nèi)容整體拷貝,只位置長度追加到套接字緩沖區(qū),DMA 引擎直接把數(shù)據(jù)從內(nèi)核緩沖區(qū)傳到協(xié)議引擎,消除最后一次 CPU拷貝

ps:面試從用戶態(tài)談到內(nèi)核態(tài),socket談到FileChannel,從NIO談到Netty,從直接內(nèi)存到CompositeBy

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 零拷貝,零開銷 本文僅是中文版本,原文由 Sathish Palaniappan, Pramod Nagaraja...
    大哥你先走閱讀 15,731評論 1 58
  • 參見:Java中的零拷貝 先提出兩個問題: IO過程中,哪些步驟進(jìn)行了拷貝?哪些地方零拷貝? Java支持哪些零拷...
    小蘇c閱讀 333評論 0 1
  • 先提出兩個問題:IO過程中,哪些步驟進(jìn)行了拷貝?哪些地方零拷貝?Java支持哪些零拷貝? 帶著這倆問題,我們一起來...
    消失er閱讀 19,675評論 9 43
  • 什么是零拷貝 維基上是這么描述零拷貝的:零拷貝描述的是CPU不執(zhí)行拷貝數(shù)據(jù)從一個存儲區(qū)域到另一個存儲區(qū)域的任務(wù),這...
    tomas家的小撥浪鼓閱讀 28,633評論 11 62
  • 啟示 父親說過一個傳說,當(dāng)太陽神不再在遠(yuǎn)處那座神廟升起的時候,世界將會毀滅。 多年之后,當(dāng)干旱、瘟疫、戰(zhàn)爭肆虐著大...
    ieshi02閱讀 265評論 0 1

友情鏈接更多精彩內(nèi)容