擴(kuò)展篇之BIO以及NIO

服務(wù)端處理網(wǎng)絡(luò)請(qǐng)求的流程圖


image.png

主要步驟包括
①獲取請(qǐng)求數(shù)據(jù): 客戶端與服務(wù)器建立連接發(fā)出請(qǐng)求蛤育,服務(wù)器接受請(qǐng)求(1-3)
②構(gòu)建響應(yīng):在用戶空間處理客戶端請(qǐng)求道伟,直到構(gòu)建響應(yīng)完成(4)
③返回?cái)?shù)據(jù):將構(gòu)建好的響應(yīng)再通過內(nèi)核空間的網(wǎng)絡(luò)I/O發(fā)還給客戶端

所以,服務(wù)端有兩個(gè)關(guān)鍵點(diǎn)
①如何管理連接粹排,獲取輸入數(shù)據(jù)
②服務(wù)器如何處理請(qǐng)求

阻塞與非阻塞

阻塞:被調(diào)用方在收到請(qǐng)求到返回結(jié)果之前的這段時(shí)間,調(diào)用方將一直等待种远。
非阻塞:調(diào)用方可以去忙別的事

所以,阻塞與非阻塞顽耳,主要說的是調(diào)用方


同步處理與異步處理

同步:被調(diào)用方得到最終結(jié)果坠敷,才返回妙同。
異步:被調(diào)用方先返回應(yīng)答,然后在計(jì)算結(jié)果膝迎,計(jì)算完最終結(jié)果再通知并返回粥帚。
所以,同步與異步,主要說的是被調(diào)用方


阻塞I_O模型.png

優(yōu)點(diǎn):在阻塞等待數(shù)據(jù)期間,進(jìn)程/線程掛起,基本不會(huì)占用CPU資源
缺點(diǎn):每個(gè)連接需要單獨(dú)的線程/進(jìn)程單獨(dú)處理,并發(fā)大時(shí)線程切換開銷大


非阻塞式I_O模型.png

優(yōu)點(diǎn):不會(huì)阻塞在內(nèi)核等待數(shù)據(jù),每次可以立馬返回限次,實(shí)時(shí)性較好
缺點(diǎn):會(huì)占用大量的CPU時(shí)間茎辐,系統(tǒng)資源利用率低


I_O復(fù)用模型.png

之前我們的I/O阻塞模型不是會(huì)創(chuàng)建大量連接?那現(xiàn)在我們就先注冊(cè)到select上,讓select有數(shù)據(jù)了再通知我們掂恕。

優(yōu)點(diǎn):可以基于一個(gè)阻塞對(duì)象,同時(shí)在多個(gè)描述符上進(jìn)行等待就緒弛槐,而不是使用多個(gè)線程懊亡。
缺點(diǎn):連接數(shù)較少時(shí)效率相比多線程+阻塞I/O模型,效率較低,延時(shí)會(huì)更大乎串。因?yàn)閱蝹€(gè)連接處理要經(jīng)過2次系統(tǒng)調(diào)用店枣,占用時(shí)間會(huì)增加


線程模型

傳統(tǒng)阻塞I_O服務(wù)模型.png

Reactor模型
針對(duì)阻塞I/O模型進(jìn)行了改進(jìn)
①基于I/O復(fù)用模型,多個(gè)連接共用一個(gè)阻塞對(duì)象叹誉,應(yīng)用程序只需要在一個(gè)阻塞對(duì)象上等待鸯两,無需等待所有連接。
②基于線程池復(fù)用線程資源长豁,不必再為每個(gè)連接創(chuàng)建線程钧唐,將連接完成后的業(yè)務(wù)處理任務(wù)分配給線程進(jìn)行處理,一個(gè)線程可以處理多個(gè)連接的業(yè)務(wù)匠襟。


Reactor模型.png

Reactor模式也叫Dispatcher模式钝侠,即I/O多了復(fù)用同一監(jiān)聽事件,收到事件后進(jìn)行分發(fā)
Reactor模式中的兩個(gè)關(guān)鍵組成
①Reactor酸舍,在單獨(dú)的線程中運(yùn)行帅韧,負(fù)責(zé)監(jiān)聽和分發(fā)事件,分發(fā)給適當(dāng)?shù)奶幚沓绦騺韺?duì)I/O事件做出反應(yīng)啃勉。
②Handlers,處理程序執(zhí)行I/O事件要完成的實(shí)際事件忽舟。

根據(jù)Reactor的數(shù)量和處理資源池線程的數(shù)量不同。
有3中典型實(shí)現(xiàn):
①單Reactor單線程
②單Reactor多線程
③主從Reactor多線程

單Reactor單線程

單Reactor單線程.png

說明:
①Reactor對(duì)象通過select監(jiān)聽客戶端請(qǐng)求時(shí)間淮阐,收到事件后通過dispatch進(jìn)行分發(fā)
②建立連接請(qǐng)求事件叮阅,則由Acceptor通過accept處理連接請(qǐng)求,然后創(chuàng)建Handler對(duì)象處理連接完成后的后續(xù)業(yè)務(wù)處理
③如果不是連接事件泣特,則Reactor會(huì)分發(fā)調(diào)用連接對(duì)應(yīng)的Handler來相應(yīng)
④Handler會(huì)完成read->業(yè)務(wù)處理->send的完整業(yè)務(wù)流程

優(yōu)點(diǎn):簡(jiǎn)單明了帘饶,沒有多線程競(jìng)爭(zhēng)
缺點(diǎn):
性能問題:只有一個(gè)線程,無法發(fā)揮多線程的優(yōu)勢(shì)
可靠性問題:線程死了群扶,會(huì)導(dǎo)致整個(gè)通信模塊不可用及刻。

使用場(chǎng)景:客戶端數(shù)量有限镀裤,業(yè)務(wù)處理非常快速缴饭,如Redis


單Reactor多線程

單Reactor多線程.png

①Reactor對(duì)象通過select監(jiān)聽客戶端請(qǐng)求時(shí)間暑劝,收到事件后通過dispatch進(jìn)行分發(fā)
②建立連接請(qǐng)求事件,則由Acceptor通過accept處理連接請(qǐng)求颗搂,然后創(chuàng)建Handler對(duì)象處理連接完成后的后續(xù)業(yè)務(wù)處理
③如果不是連接事件担猛,則Reactor會(huì)分發(fā)調(diào)用連接對(duì)應(yīng)的Handler來相應(yīng)
④Handler只負(fù)責(zé)響應(yīng)事件,不做業(yè)務(wù)處理,通過read讀取數(shù)據(jù)后丢氢,分發(fā)給后面的Worker線程池進(jìn)行業(yè)務(wù)處理
⑤Worker線程池分配獨(dú)立的線程完成真正的業(yè)務(wù)處理
⑥Handler收到響應(yīng)結(jié)果后通過send將結(jié)果返回給client

優(yōu)點(diǎn):可以充分利用多核CPU
缺點(diǎn):Reactor在高并發(fā)下容易成為性能瓶頸


主從Reactor多線程

主從Reactor多線程.png

①Reactor主線程MainReactor對(duì)象通過select監(jiān)聽客戶端請(qǐng)求時(shí)間傅联,收到事件后由Acceptor通過accept處理連接請(qǐng)求,建立連接請(qǐng)求事件
②Acceptor處理建立連接事件后,MainReactor將連接分配給SubReactor進(jìn)行處理
③SubReactor將連接加入到連接隊(duì)列進(jìn)行監(jiān)聽疚察,并創(chuàng)建一個(gè)Handler用于處理連接事件
④當(dāng)新事件發(fā)生時(shí)蒸走,SubReactor會(huì)調(diào)用連接對(duì)應(yīng)的Handler進(jìn)行響應(yīng)。
⑤Handler只負(fù)責(zé)響應(yīng)事件,不做業(yè)務(wù)處理貌嫡,通過read讀取數(shù)據(jù)后比驻,分發(fā)給后面的Worker線程池進(jìn)行業(yè)務(wù)處理
⑥Worker線程池分配獨(dú)立的線程完成真正的業(yè)務(wù)處理
⑦Handler收到響應(yīng)結(jié)果后通過send將結(jié)果返回給client

優(yōu)點(diǎn):父線程與子線程數(shù)據(jù)交互簡(jiǎn)單,職責(zé)明確岛抄,父線程只需要接收新連接别惦,子線程完成后續(xù)的業(yè)務(wù)處理

使用場(chǎng)景:Ngnix主從多進(jìn)程模型,Netty主從多線程模型

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市夫椭,隨后出現(xiàn)的幾起案子掸掸,更是在濱河造成了極大的恐慌,老刑警劉巖蹭秋,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猾漫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡感凤,警方通過查閱死者的電腦和手機(jī)悯周,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陪竿,“玉大人禽翼,你說我怎么就攤上這事∽艴耍” “怎么了闰挡?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)礁哄。 經(jīng)常有香客問我长酗,道長(zhǎng),這世上最難降的妖魔是什么桐绒? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任夺脾,我火速辦了婚禮之拨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咧叭。我一直安慰自己蚀乔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布菲茬。 她就那樣靜靜地躺著吉挣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪婉弹。 梳的紋絲不亂的頭發(fā)上睬魂,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音镀赌,去河邊找鬼氯哮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛佩脊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垫卤,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼威彰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了穴肘?” 一聲冷哼從身側(cè)響起歇盼,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎评抚,沒想到半個(gè)月后豹缀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慨代,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年邢笙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侍匙。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氮惯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出想暗,到底是詐尸還是另有隱情妇汗,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布说莫,位于F島的核電站杨箭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏储狭。R本人自食惡果不足惜互婿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一捣郊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧擒悬,春花似錦模她、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至僧凤,卻和暖如春畜侦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躯保。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工旋膳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人途事。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓验懊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親尸变。 傳聞我的和親對(duì)象是個(gè)殘疾皇子义图,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • 本文是Netty文集中“Netty 那些事兒”系列的文章。主要結(jié)合在開發(fā)實(shí)戰(zhàn)中召烂,我們遇到的一些“奇奇怪怪”的問題碱工,...
    tomas家的小撥浪鼓閱讀 15,508評(píng)論 3 35
  • NIO(Non-blocking I/O,在Java領(lǐng)域奏夫,也稱為New I/O)怕篷,是一種同步非阻塞的I/O模型,也...
    Demon_code閱讀 390評(píng)論 0 0
  • NIO(Non-blocking I/O酗昼,在Java領(lǐng)域廊谓,也稱為New I/O),是一種同步非阻塞的I/O模型麻削,也...
    閃電是只貓閱讀 3,118評(píng)論 0 7
  • 隨著互聯(lián)網(wǎng)的發(fā)展蹂析,面對(duì)海量用戶高并發(fā)業(yè)務(wù),傳統(tǒng)的阻塞式的服務(wù)端架構(gòu)模式已經(jīng)無能為力碟婆,由此电抚,本文旨在為大家提供有用的...
    caison閱讀 10,638評(píng)論 3 42
  • 1、基礎(chǔ)I/O模型 在《UNIX網(wǎng)絡(luò)編程》中介紹了5中I/O模型:阻塞I/O竖共、非阻塞I/O蝙叛、I/O復(fù)用、SIGIO...
    橋頭放牛娃閱讀 3,571評(píng)論 3 14