深入理解NIO零拷貝

NIO零拷貝

普通IO操作流程

image.png
  1. 用戶程序向內(nèi)核程序發(fā)起讀請(qǐng)求
  2. cpu從用戶模式切換到內(nèi)核模式希坚,內(nèi)核模式向磁盤發(fā)出讀取數(shù)據(jù)的請(qǐng)求
  3. 磁盤將數(shù)據(jù)讀取到內(nèi)核空間的緩沖區(qū)
  4. 內(nèi)核將數(shù)據(jù)從緩沖區(qū)拷貝到用戶空間的緩沖區(qū)
  5. 執(zhí)行邏輯代碼
  6. 執(zhí)行write方法柴钻,將數(shù)據(jù)寫到網(wǎng)絡(luò)的另一端。
  7. 將數(shù)據(jù)從用戶空間拷貝回內(nèi)核空間
  8. 將數(shù)據(jù)真正的寫到磁盤或者socket中
    這種方式會(huì)導(dǎo)致系統(tǒng)遇到瓶頸货葬,為傳統(tǒng)IO操作

零拷貝

零拷貝依賴于操作系統(tǒng)采幌,操作系統(tǒng)實(shí)現(xiàn)了,則實(shí)現(xiàn)震桶,沒有實(shí)現(xiàn)則沒有實(shí)現(xiàn)休傍,跟java程序無關(guān)。


image.png
  1. 從圖中可以看出對(duì)用戶空間的數(shù)據(jù)拷貝已經(jīng)沒了蹲姐。
  2. 內(nèi)核空間收到sendfile()申請(qǐng)
  3. 內(nèi)核空間向磁盤發(fā)送數(shù)據(jù)讀取請(qǐng)求
  4. 磁盤將數(shù)據(jù)讀取到內(nèi)核空間緩沖區(qū)
  5. 將數(shù)據(jù)寫入到socket緩沖區(qū)中
  6. 通過socket緩沖區(qū)向網(wǎng)絡(luò)客戶端發(fā)送數(shù)據(jù)
  7. 結(jié)果返回
  8. sendfile()調(diào)用返回
    這種操作我們稱為零拷貝磨取,相對(duì)與上一種情況有了極大的提升。
思考:

我們能不能減少磁盤拷貝到內(nèi)核的情況柴墩,而是將磁盤數(shù)據(jù)直接拷貝到socket緩沖區(qū)中忙厌??

第二版零拷貝

image.png

這種方式實(shí)現(xiàn)了從磁盤空間直接讀入Socket緩沖區(qū)

最終版零拷貝

image.png
  1. 用戶程序發(fā)送sendfile()指令給內(nèi)核空間并返回到用戶空間
  2. 內(nèi)核空間從磁盤采用DMA copy將數(shù)據(jù)從磁盤拷貝到了內(nèi)核空間
  3. 將內(nèi)核緩沖區(qū)的數(shù)據(jù)的文件描述符的信息拷貝到socketbuffer江咳,而不是數(shù)據(jù)逢净。文件描述中含有數(shù)據(jù)的內(nèi)存地址等信息。
  4. protocol協(xié)議直接通過socketbuffer中讀取到文件描述符信息從而找到kernel buffer存儲(chǔ)數(shù)據(jù)的內(nèi)存地址以及所需讀取字符的長度歼指。并將kernel buffer中的數(shù)據(jù)發(fā)送服務(wù)端

內(nèi)存映射:

問題:上面的情況用戶無法參與到數(shù)據(jù)的讀取與寫入的過程爹土,如果用戶需要參與呢?踩身?
內(nèi)存映射文件:
通過代碼的方式將文件映射到系統(tǒng)內(nèi)核空間胀茵,這樣修改文件只需要訪問內(nèi)核空間就可以。

參考

零拷貝學(xué)習(xí)
淺談Linux下的零拷貝機(jī)制
mmap原理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挟阻,一起剝皮案震驚了整個(gè)濱河市宰掉,隨后出現(xiàn)的幾起案子呵哨,更是在濱河造成了極大的恐慌,老刑警劉巖轨奄,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拒炎,居然都是意外死亡挪拟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門击你,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玉组,“玉大人,你說我怎么就攤上這事丁侄」喏ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵鸿摇,是天一觀的道長石景。 經(jīng)常有香客問我,道長拙吉,這世上最難降的妖魔是什么潮孽? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮筷黔,結(jié)果婚禮上往史,老公的妹妹穿的比我還像新娘。我一直安慰自己佛舱,他們只是感情好椎例,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著请祖,像睡著了一般订歪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上损拢,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天陌粹,我揣著相機(jī)與錄音,去河邊找鬼福压。 笑死掏秩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荆姆。 我是一名探鬼主播蒙幻,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼胆筒!你這毒婦竟也來了邮破?” 一聲冷哼從身側(cè)響起诈豌,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抒和,沒想到半個(gè)月后矫渔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摧莽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年庙洼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镊辕。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡油够,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出征懈,到底是詐尸還是另有隱情石咬,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布卖哎,位于F島的核電站鬼悠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏棉饶。R本人自食惡果不足惜厦章,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望照藻。 院中可真熱鬧袜啃,春花似錦、人聲如沸幸缕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽发乔。三九已至熟妓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栏尚,已是汗流浹背起愈。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留译仗,地道東北人抬虽。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像纵菌,于是被迫代替她去往敵國和親阐污。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容