【初識Netty】IO模型

Netty是什么?

作為Java開發(fā)者,相信大家或多或少都聽說過或者是使用過Netty杏死,而說起Netty,就不得不先說一下IO模型捆交。

IO模型

Unix網(wǎng)絡(luò)編程中定義了五種網(wǎng)絡(luò)模型:

  1. 阻塞IO
  2. 非阻塞IO
  3. IO多路復(fù)用
  4. 信號驅(qū)動IO
  5. 異步IO

很多朋友在看到IO淑翼、阻塞、非阻塞品追、同步玄括、異步等字眼的時候都感到頭大,之前也和同事討論過這個問題肉瓦。那么是不是阻塞等于同步遭京,非阻塞等于異步?按照我自己的理解來說:

  • 同步泞莉、異步:是一種訪問數(shù)據(jù)的方式哪雕,同步需要主動的進(jìn)行數(shù)據(jù)讀寫,而異步則只需要一個數(shù)據(jù)讀寫成功的通知鲫趁,讀寫都由內(nèi)核來完成
  • 阻塞斯嚎、非阻塞:是進(jìn)程在IO過程中是否會掛起進(jìn)行等待,如果需要等待則是阻塞挨厚,否則是非阻塞

從上面的描述上可以看到堡僻,凡是異步的IO,就一定是非阻塞的疫剃,不存在異步阻塞IO這種IO模型苦始,前四種IO模型全部是同步IO。一次IO操作簡單來說會經(jīng)歷兩個階段:

  1. 等待數(shù)據(jù)準(zhǔn)備完成
  2. 從內(nèi)核將數(shù)據(jù)拷貝至用戶進(jìn)程中

1.阻塞IO

阻塞IO

從圖上可以看到慌申,在阻塞IO模型中用戶進(jìn)程發(fā)起一次IO請求陌选,內(nèi)核需要等待數(shù)據(jù)準(zhǔn)備完成理郑,在數(shù)據(jù)準(zhǔn)備完成后,進(jìn)行數(shù)據(jù)拷貝咨油,拷貝完成后給用戶進(jìn)程返回IO成功您炉。從應(yīng)用角度來看,整個IO過程直至內(nèi)核返回成功之前役电,進(jìn)程都處等待操作完成的狀態(tài)赚爵;而從內(nèi)核角度來看,數(shù)據(jù)準(zhǔn)備階段法瑟,需要阻塞等待數(shù)據(jù)準(zhǔn)備完成冀膝,數(shù)據(jù)拷貝階段也需要阻塞等待拷貝完成,IO的兩個階段都被阻塞了霎挟,所以這是一種同步阻塞的IO方式窝剖。

2.非阻塞IO

非阻塞IO

阻塞IO工作時,用戶進(jìn)程完全被阻塞住而不能進(jìn)行其他的工作酥夭。從圖中可以看出赐纱,當(dāng)用戶進(jìn)程發(fā)出read操作時,如果內(nèi)核中的數(shù)據(jù)還沒有準(zhǔn)備好熬北,那么它并不會阻塞用戶進(jìn)程疙描,而是立刻返回一個error。從用戶進(jìn)程角度講 讶隐,它發(fā)起一個read操作后起胰,并不需要等待,而是馬上就得到了一個結(jié)果巫延。用戶進(jìn)程判斷結(jié)果是一個error時效五,它就知道數(shù)據(jù)還沒有準(zhǔn)備好,于是它可以再次發(fā)送read操作烈评。一旦內(nèi)核中的數(shù)據(jù)準(zhǔn)備好了火俄,并且又再次收到了用戶進(jìn)程的system call犯建,那么它馬上就將數(shù)據(jù)拷貝到了用戶內(nèi)存讲冠,然后返回。在非阻塞式IO中适瓦,用戶進(jìn)程其實是需要不斷的主動詢問內(nèi)核數(shù)據(jù)準(zhǔn)備好了沒有。

3.IO多路復(fù)用

IO多路復(fù)用

IO多路復(fù)用也會被人們稱為事件驅(qū)動IO。使用select/epoll的好處就在于單個process就可以同時處理多個網(wǎng)絡(luò)連接的IO会涎。它的基本原理就是select/epoll這個方法會不斷的輪詢所負(fù)責(zé)的所有socket宏多,當(dāng)某個socket有數(shù)據(jù)到達(dá)了,就通知用戶進(jìn)程嗦随。用戶進(jìn)程收到通知后進(jìn)行數(shù)據(jù)拷貝的系統(tǒng)調(diào)用列荔,這個階段是從內(nèi)核角度來看阻塞等待數(shù)據(jù)拷貝完成的敬尺,所以IO多路復(fù)用也是一種同步的IO模式。

4.異步IO

異步IO

用戶進(jìn)程發(fā)起read操作之后贴浙,立刻就可以開始去做其它的事砂吞。而另一方面,從內(nèi)核的角度崎溃,當(dāng)它收到一個異步讀請求之后蜻直,首先會立刻返回,所以不會對用戶進(jìn)程產(chǎn)生任何阻塞袁串。然后概而,內(nèi)核會等待數(shù)據(jù)準(zhǔn)備完成,然后將數(shù)據(jù)拷貝到用戶內(nèi)存囱修,當(dāng)這一切都完成之后赎瑰,內(nèi)核會給用戶進(jìn)程發(fā)送一個signal,告訴它read操作完成了蔚袍。整個過程中都不需要用戶進(jìn)程進(jìn)行主動的阻塞數(shù)據(jù)讀寫操作乡范,完全沒有阻塞。用戶進(jìn)程只需要發(fā)起IO請求啤咽,然后做其他事晋辆,收到IO完成的通知后,直接對數(shù)據(jù)進(jìn)行操作宇整。

Java NIO

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓶佳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鳞青,更是在濱河造成了極大的恐慌霸饲,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臂拓,死亡現(xiàn)場離奇詭異厚脉,居然都是意外死亡,警方通過查閱死者的電腦和手機胶惰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門傻工,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人孵滞,你說我怎么就攤上這事中捆。” “怎么了坊饶?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵泄伪,是天一觀的道長。 經(jīng)常有香客問我匿级,道長蟋滴,這世上最難降的妖魔是什么染厅? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮津函,結(jié)果婚禮上糟秘,老公的妹妹穿的比我還像新娘。我一直安慰自己球散,他們只是感情好尿赚,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蕉堰,像睡著了一般凌净。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屋讶,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天冰寻,我揣著相機與錄音,去河邊找鬼皿渗。 笑死斩芭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乐疆。 我是一名探鬼主播划乖,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挤土!你這毒婦竟也來了琴庵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仰美,失蹤者是張志新(化名)和其女友劉穎迷殿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咖杂,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡庆寺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诉字。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懦尝。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奏窑,靈堂內(nèi)的尸體忽然破棺而出导披,到底是詐尸還是另有隱情屈扎,我是刑警寧澤埃唯,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鹰晨,受9級特大地震影響墨叛,放射性物質(zhì)發(fā)生泄漏止毕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一漠趁、第九天 我趴在偏房一處隱蔽的房頂上張望扁凛。 院中可真熱鬧闯传,春花似錦谨朝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至共缕,卻和暖如春洗出,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背图谷。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工翩活, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人便贵。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓菠镇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親承璃。 傳聞我的和親對象是個殘疾皇子辟犀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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