NIO扣草、AIO概念理解和學(xué)習(xí)

1.Java NIO中的同步辰妙、異步、阻塞和非阻塞(非NIO2.0)

在不同的上下文環(huán)境中福荸,Java NIO的模式可以說成是同步肴掷、異步、阻塞台夺、非阻塞颤介,關(guān)注點不同赞赖,結(jié)論不同,本文主要記錄自己的理解辕近。

  • 為什么說是同步

  • 按照UNIX網(wǎng)絡(luò)編程模型的說法移宅,Java NIO使用的I/O復(fù)用模型在select調(diào)用上發(fā)生了阻塞椿疗,因此不屬于異步I/O,參見原文定義:

An asynchronous I/O operation does not cause the requesting process to be blocked.

  • 數(shù)據(jù)準(zhǔn)備好(就緒)后浅乔,用戶線程仍需要主動同步進行I/O讀寫操作童擎,而真正的異步I/O模型下攻晒,用戶線程不參與拷貝讀寫鲁捏,如下圖:
  • 為什么說是異步

    • 用戶線程注冊事件處理器Selector之后可以繼續(xù)執(zhí)行做其他的工作,而Selector線程負(fù)責(zé)調(diào)用內(nèi)核的select函數(shù)檢查socket狀態(tài)假丧。當(dāng)有socket被激活時包帚,則通知相應(yīng)的用戶線程(或執(zhí)行用戶線程的回調(diào)函數(shù))运吓,執(zhí)行handle_event進行數(shù)據(jù)讀取、處理的工作谋梭。這種通知調(diào)用方式屬于異步調(diào)用瓮床。

    • NIO類庫支持非阻塞讀和寫操作,相比于同步阻塞讀寫隘庄,是異步的,這里的異步非阻塞是同義語

  • 為什么說是阻塞

    • select調(diào)用是阻塞的贾虽,如下圖:


    • NIO類庫也支持通道的阻塞模式(configureBlocking方法設(shè)置為true)蓬豁,但是如果向一個或多個選擇器注冊了此通道地粪,則嘗試將此通道置于阻塞模式將導(dǎo)致拋出 IllegalBlockingModeException蟆技,一般設(shè)置為非阻塞。
  • 為什么說是非阻塞

    • NIO類庫支持非阻塞讀和寫操作质礼,向選擇器selector注冊的通道一般為非阻塞模式
2.關(guān)于非阻塞讀寫
  • 這里所說的非阻塞是針對I/O模型里面的數(shù)據(jù)拷貝階段眶蕉,如recvfrom函數(shù)調(diào)用造挽,而不是非阻塞I/O模型(圖6.6)

  • 這里所說的非阻塞是指socket函數(shù)本身(如recvfrom)可以設(shè)置為阻塞和非阻塞模式弄痹,阻塞模式意味著必須要做完IO操作(包括錯誤)才會返回肛真。 非阻塞模式下無論操作是否完成都會立刻返回,需要通過其他方式來判斷具體操作是否成功

  • 對于讀而言:阻塞和非阻塞I/O的區(qū)別在于沒有數(shù)據(jù)到達(dá)的時候是否立刻返回

  • 對于寫而言:在阻塞I/O的情況是會一直等待直到write完全部的數(shù)據(jù)再返回讥珍,這個和阻塞讀有區(qū)別饭耳。非阻塞寫的情況下寞肖,是采用可以寫多少就寫多少的策略

3. 關(guān)于異步I/O(NIO2.0)
  • 為什么說AIO是真正的異步I/O
    當(dāng)用戶線程收到通知時新蟆,數(shù)據(jù)已經(jīng)被內(nèi)核讀取完畢右蕊,并放在了用戶線程指定的緩沖區(qū)內(nèi),內(nèi)核在IO完成后通知用戶線程直接使用即可帕翻,在整個過程中嘀掸,用戶線程除了發(fā)起請求之外未參與任何I/O相關(guān)的操作睬塌,也并未被任何函數(shù)阻塞歇万。

  • AIO與NIO的區(qū)別,在Client端體現(xiàn)為用戶線程得到通知的時間點

在NIO中硫兰,當(dāng)發(fā)生相應(yīng)讀寫事件時瞄崇,用戶線程得到通知,表明數(shù)據(jù)已就緒苏研,開始同步調(diào)用非阻塞讀寫函數(shù)摹蘑,Java API如下:

java.nio.channels.SocketChannel.read(ByteBuffer dst)
java.nio.channels.SocketChannel.write(ByteBuffer src)

在AIO中撒踪,當(dāng)發(fā)生相應(yīng)事件時制妄,用戶線程得到通知耕捞,表明I/O操作已經(jīng)由操作系統(tǒng)異步完成俺抽,用戶線程只需事先向內(nèi)核申明I/O緩沖區(qū)较曼、注冊handler并定義回調(diào)的completed方法即可,Java API如下:

java.nio.channels.AsynchronousSocketChannel.read(ByteBuffer dst, ByteBuffer attachment, CompletionHandler<Integer, ? super ByteBuffer> handler)
java.nio.channels.AsynchronousSocketChannel.write(ByteBuffer src, ByteBuffer attachment, CompletionHandler<Integer, ? super ByteBuffer> handler)
  • AIO與NIO的區(qū)別,在Server端體現(xiàn)為Reactor/Proactor的區(qū)別萍歉,在NIO中,監(jiān)控的事件通常為數(shù)據(jù)的到達(dá)横蜒;在AIO中丛晌,監(jiān)控的是事件通常為I/O的完成
4. 參考資料

網(wǎng)絡(luò)編程常見問題總結(jié)
Scalable IO in Java
高性能IO模型淺析
兩種高性能I/O設(shè)計模式(Reactor/Proactor)的比較

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澎蛛,一起剝皮案震驚了整個濱河市谋逻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桐经,老刑警劉巖毁兆,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異阴挣,居然都是意外死亡气堕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茎芭,“玉大人揖膜,你說我怎么就攤上這事∶纷” “怎么了壹粟?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宿百。 經(jīng)常有香客問我犀呼,道長,這世上最難降的妖魔是什么宋光? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任赘艳,我火速辦了婚禮菩暗,結(jié)果婚禮上旷坦,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好这刷,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布咐刨。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卷胯,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天担钮,我揣著相機與錄音,去河邊找鬼鲤嫡。 笑死,一個胖子當(dāng)著我的面吹牛司澎,可吹牛的內(nèi)容都是我干的丧鸯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼氢伟,長吁一口氣:“原來是場噩夢啊……” “哼差导!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤西轩,失蹤者是張志新(化名)和其女友劉穎庄拇,沒想到半個月后女淑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苇本,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡贱鄙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年瞎颗,在試婚紗的時候發(fā)現(xiàn)自己被綠了引有。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片檬姥。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荞雏,靈堂內(nèi)的尸體忽然破棺而出蜈彼,到底是詐尸還是另有隱情幸逆,我是刑警寧澤还绘,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布电媳,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏穴翩。R本人自食惡果不足惜带膀,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垛叨。 院中可真熱鬧伦糯,春花似錦、人聲如沸嗽元。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剂癌。三九已至载慈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間珍手,已是汗流浹背办铡。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留琳要,地道東北人寡具。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像稚补,于是被迫代替她去往敵國和親童叠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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