Java NIO學(xué)習(xí)筆記 - Linux 網(wǎng)絡(luò)I/O 模型

Linux的內(nèi)核將所有外部設(shè)備都看做一個(gè)文件來操作疗涉,對一個(gè)文件的讀寫操作會調(diào)用內(nèi)核提供的系統(tǒng)命令,返回一個(gè)file descriptor(fd吟秩,文件描述符 )咱扣。而對一個(gè)socket的讀寫也會有相應(yīng)的描述符,稱為socketfd(socket描述符)峰尝,描述符就是一個(gè)數(shù)字偏窝,它指向內(nèi)核中的一個(gè)結(jié)構(gòu)體(文件路徑,數(shù)據(jù)區(qū)等一些屬性)武学。

根據(jù)UNIX網(wǎng)絡(luò)編程對I/O模型的分類祭往,UNIX提供了5種I/O模型,分別如下:

1火窒、阻塞I/O模型

最常用的I/O模型就是阻塞I/O模型硼补,缺省情形下,所有文件操作都是阻塞的熏矿。我們以套接字接口為例來講解此模型已骇。在進(jìn)程空間中調(diào)用recvfrom拣展,其系統(tǒng)調(diào)用直到數(shù)據(jù)包到達(dá)且被復(fù)制到應(yīng)用進(jìn)程的緩沖區(qū)中或者發(fā)生錯(cuò)誤時(shí)才返回娃圆,在此期間一直會等待,進(jìn)程在從調(diào)用recvfrom開始到它返回的整段時(shí)間內(nèi)都是被阻塞的瓣赂,因此被稱為阻塞I/O模型慧域。如下圖所示:

1.png

2鲤竹、非阻塞I/O模型

rcvfrom從應(yīng)用層到內(nèi)核的時(shí)候,如果該緩沖區(qū)沒有數(shù)據(jù)的話昔榴,就直接返回一個(gè)EWOULDBLOCK錯(cuò)誤辛藻,一般都對非阻塞I/O模型進(jìn)行輪詢檢查這個(gè)狀態(tài),看內(nèi)核是不是有數(shù)據(jù)到來互订。如下圖所示:

2.png

3吱肌、I/O復(fù)用模型

Linux提供select/poll(I/O復(fù)用模型會用到select或者poll函數(shù),這兩個(gè)函數(shù)也會使進(jìn)程阻塞仰禽,但是和阻塞I/O所不同的是氮墨,這兩個(gè)函數(shù)可以同時(shí)阻塞多個(gè)I/O操作纺蛆。而且可以同時(shí)對多個(gè)讀操作,多個(gè)寫操作的I/O函數(shù)進(jìn)行檢測勇边,直到有數(shù)據(jù)可讀或可寫時(shí)犹撒,才真正調(diào)用I/O操作函數(shù)),進(jìn)程通過將一個(gè)或多個(gè)fd傳遞給select或poll系統(tǒng)調(diào)用粒褒,阻塞在select操作上,這樣select/poll可以幫我們偵測多fd是否處于就緒狀態(tài)诚镰。select/poll是順序掃描fd是否就緒奕坟,而且支持的fd數(shù)量有限,因此它的使用受到了一些制約清笨。Linux還提供了一個(gè)epoll系統(tǒng)調(diào)用月杉,epoll使用基于事件驅(qū)動方式代替順序掃描,因此性能更高抠艾。當(dāng)有fd就緒時(shí)苛萎,立即回調(diào)函數(shù)rollback。如下圖所示:

3.png

4检号、信號驅(qū)動I/O模型

首先開啟套接口信號驅(qū)動I/O功能腌歉,并通過系統(tǒng)調(diào)用sigaction執(zhí)行一個(gè)信號處理函數(shù)(此系統(tǒng)調(diào)用立即返回,進(jìn)程繼續(xù)工作齐苛,它是非阻塞的)翘盖。當(dāng)數(shù)據(jù)準(zhǔn)備就緒時(shí),就為該進(jìn)程生成一個(gè)SIGIO信號凹蜂,通過信號回調(diào)通知應(yīng)用程序調(diào)用recvfrom來讀取數(shù)據(jù)馍驯,并通知主循環(huán)函數(shù)處理數(shù)據(jù)。如下圖所示:

4.png

5玛痊、異步I/O

告知內(nèi)核啟動某個(gè)操作汰瘫,并讓內(nèi)核在整個(gè)操作完成后(包括將數(shù)據(jù)從內(nèi)核復(fù)制到用戶自己的緩沖區(qū))通知我們。這種模型與信號驅(qū)動模型的主要區(qū)別是:信號驅(qū)動I/O由內(nèi)核通知我們何時(shí)可以開始一個(gè)I/O操作擂煞;異步I/O模型由內(nèi)核通知我們I/O操作何時(shí)已經(jīng)完成混弥。

5.png

如果想要了解更多的UNIX系統(tǒng)網(wǎng)絡(luò)編程知識,可以閱讀《UNIX網(wǎng)絡(luò)編程》颈娜,里面有非常詳細(xì)的原理和API介紹剑逃。對于大多數(shù)Java程序員來說,不需要了解網(wǎng)絡(luò)編程的底層細(xì)節(jié)官辽,大家只需要有個(gè)概念蛹磺,知道對于操作系統(tǒng)而言,底層是支持異步I/O通信的同仆,只不過在很長一段時(shí)間Java并沒有提供異步I/O通信的類庫萤捆,導(dǎo)致很多原生的Java程序員對這塊兒比較陌生。當(dāng)你了解了網(wǎng)絡(luò)編程的基礎(chǔ)知識后,理解Java的NIO類庫就會更加容易一些俗或。

參考資料

Netty權(quán)威指南 第二版

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末市怎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辛慰,更是在濱河造成了極大的恐慌区匠,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帅腌,死亡現(xiàn)場離奇詭異驰弄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)速客,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門戚篙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人溺职,你說我怎么就攤上這事岔擂。” “怎么了浪耘?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵乱灵,是天一觀的道長。 經(jīng)常有香客問我点待,道長阔蛉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任癞埠,我火速辦了婚禮状原,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苗踪。我一直安慰自己颠区,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布通铲。 她就那樣靜靜地躺著毕莱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颅夺。 梳的紋絲不亂的頭發(fā)上朋截,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機(jī)與錄音吧黄,去河邊找鬼部服。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拗慨,可吹牛的內(nèi)容都是我干的廓八。 我是一名探鬼主播奉芦,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剧蹂!你這毒婦竟也來了声功?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宠叼,失蹤者是張志新(化名)和其女友劉穎先巴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冒冬,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筹裕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年窄驹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片证逻。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乐埠,死狀恐怖囚企,靈堂內(nèi)的尸體忽然破棺而出丈咐,到底是詐尸還是另有隱情,我是刑警寧澤龙宏,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布棵逊,位于F島的核電站,受9級特大地震影響银酗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛙讥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翔曲。 院中可真熱鬧迫像,春花似錦闻妓、人聲如沸纷闺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽署鸡。三九已至靴庆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炉抒,已是汗流浹背焰薄。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留野瘦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像衰猛,于是被迫代替她去往敵國和親啡省。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

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