IO模型


title: 【Netty】IO模型
date: 2017-07-17 00:14:18
tags:

  • Netty
  • Java
    categories: Netty

網絡 IO 模型

UNIX 網絡編程對 IO 模型分類, UNIX 提供 5 種 IO 模型

在這 5 個 IO 模型之前,先看看這五個 IO 模型最后的關注點:

用戶 & 內核空間

內核:操作系統(tǒng)的核心茅主,獨立于普通的應用程序昂验,可以訪問受保護的內存空間液样,有訪問底層硬件設備的所有權限

為了保證用戶進程不能直接操作內核(kernel)祟剔,保證內核的安全挚歧,操作系統(tǒng)將虛擬空間劃分為兩部分于宙,一部分為內核空間浮驳,一部分為用戶空間。

緩存 IO

數(shù)據會先拷貝到操作系統(tǒng)內核的緩沖區(qū)捞魁,然后才從操作系統(tǒng)內核的緩沖區(qū)拷貝到應用程序的地址空間

缺點:數(shù)據需要在應用程序空間和內核空間進行數(shù)據拷貝至会,影響效率

有了上面幾個基本概念下面看看網絡 IO

網絡 IO

IO 操作的本質是對數(shù)據的讀寫。因為 IO 緩存的緣故谱俭,一個 IO 操作需要分為兩步奉件,以讀操作為例:

  1. 等待數(shù)據準備
  2. 將數(shù)據從內核空間拷貝到用戶空間

對網絡 IO 而言,上面的兩步可以更具象的表述為:

  1. 等待網絡數(shù)據分組到達昆著,然后將其復制到內核緩沖區(qū)
  2. 把數(shù)據從內核緩沖區(qū)復制到應用空間緩沖區(qū)

由于網絡傳輸?shù)牟淮_定性县貌,第一步操作可能成為最耗時的過程(可能比后面的業(yè)務邏輯計算都更為耗時)。

下面看 5 個 IO 模型是如何解決問題的凑懂,相關的圖就不放了網上一大把:

阻塞 IO 模型

這個模型下煤痕,其實就是不解決任何問題,第一步接谨,第二部都是阻塞的摆碉。

以 socket 操作為例,進程空間調用 recvfrom脓豪,其系統(tǒng)調用會直到數(shù)據包到達并且復制到應用進程緩沖區(qū)才返回巷帝。

非阻塞 IO 模型

使用輪詢操作,避免第一步操作完全被阻塞扫夜。

進程調用 recvfrom楞泼,如果緩沖區(qū)沒有數(shù)據立即返回一個 EWOULDBLOCK驰徊,通過輪詢操作檢查內核緩沖區(qū)是否有數(shù)據到來。

IO 復用模型

Linux 提供系統(tǒng)調用堕阔,進程將文件描述符傳遞給系統(tǒng)調用辣垒,若第一步未就緒則阻塞在系統(tǒng)調用上。

Linux對 IO 復用模型提供的系統(tǒng)調用:

  • select:順序描述所有文件描述符印蔬,文件描述符最多持有 1024 個
  • poll:類似于select勋桶,只是去除了文件描述符數(shù)組長度的限制
  • epoll:利用mmap技術避免了這些復制和遍歷操作

Java NIO多路復用器 Selector 就是基于 epoll 的多路復用技術實現(xiàn)的

信號驅動 IO 模型

應用進程建立 SIGIO 信號處理程序,調用 sigaction 后返回侥猬。IO 第一步完成后通知程序例驹。

異步 IO

告知內核啟動某個操作,并讓內核在整個操作完成后通知我們退唠。

IO 模型對比

IO 模型對比.png

Java 對于 IO 模型的實現(xiàn)

JDK 支持

  • JDK 1.0 ~ JDK 1.3:傳統(tǒng)的 BIO鹃锈,基于阻塞 IO 模型
  • JDK 1.4 ~ JDK 1.5:加入 NIO辽装,基于 IO 復用模型
    • JDK 1.4 ~ JDK 1.5 update10:Selector 基于 select/poll 模型實現(xiàn)
    • JDK 1.5 update & Linux core 2.6 以上:Selector 使用 epoll 模型實現(xiàn)
  • JDK 1.7 ~ JDK 1.8(目前):加入 NIO 2.0(AIO)耙箍,增加異步套接字通道

使用


參考:

  1. 《Netty 權威指南》(第2版):第1章腻菇,第2章
  2. 聊聊并發(fā)苛骨,Part 1:IO模型
  3. 聊聊Linux 五種IO模型
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市臊恋,隨后出現(xiàn)的幾起案子冈钦,更是在濱河造成了極大的恐慌居凶,老刑警劉巖滩愁,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躯喇,死亡現(xiàn)場離奇詭異,居然都是意外死亡硝枉,警方通過查閱死者的電腦和手機廉丽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妻味,“玉大人正压,你說我怎么就攤上這事≡鹎颍” “怎么了焦履?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長棕诵。 經常有香客問我裁良,道長,這世上最難降的妖魔是什么校套? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮牧抵,結果婚禮上笛匙,老公的妹妹穿的比我還像新娘侨把。我一直安慰自己,他們只是感情好妹孙,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布秋柄。 她就那樣靜靜地躺著,像睡著了一般蠢正。 火紅的嫁衣襯著肌膚如雪骇笔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天嚣崭,我揣著相機與錄音笨触,去河邊找鬼。 笑死雹舀,一個胖子當著我的面吹牛芦劣,可吹牛的內容都是我干的。 我是一名探鬼主播说榆,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼虚吟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了签财?” 一聲冷哼從身側響起串慰,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唱蒸,沒想到半個月后模庐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡油宜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年掂碱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慎冤。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡疼燥,死狀恐怖,靈堂內的尸體忽然破棺而出蚁堤,到底是詐尸還是另有隱情醉者,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布披诗,位于F島的核電站撬即,受9級特大地震影響,放射性物質發(fā)生泄漏呈队。R本人自食惡果不足惜剥槐,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宪摧。 院中可真熱鬧粒竖,春花似錦颅崩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朽砰,卻和暖如春尖滚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞧柔。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工漆弄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人非剃。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓置逻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親备绽。 傳聞我的和親對象是個殘疾皇子券坞,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內容