I/O模型之三: I/O 設計模式 Reactor

平時接觸的開源產品如Redis、ACE舱禽,事件模型都使用的Reactor模式炒刁;而同樣做事件處理的Proactor,由于操作系統(tǒng)的原因誊稚,相關的開源產品也少翔始;這里學習下其模型結構,重點對比下兩者的異同點里伯;Reactor 和 Proactor 是基于事件驅動城瞎,在網絡編程中經常用到兩種設計模式。

說到異步IO疾瓮,其實現在很難實現真正的異步脖镀,大部分情況下仍然需要阻塞在某個多路復用函數,比如select 或者 epoll 上爷贫,得到就緒描述符认然,然后調用注冊在相應描述符上的回調函數。這種方式是現在的反應堆設計的基本思路漫萄。我截取一段反應堆模型的圖給大家看看卷员。
事件循環(huán)阻塞查看描述符是否就緒,當就緒后返回可讀或可寫的描述符腾务,也有可能帶外數據或者出錯等情況毕骡。

因為 select 很多文章都介紹了,下面我就以 epoll 為例,貌似是2.4.6還是哪個版本以后加入的IO多路復用方式未巫。

epoll 較select 的一些優(yōu)點就不多說了窿撬,內核采用紅黑樹機制,大大提高了epoll 的性能叙凡。著名的 libevent Nginx等內部都采用這個機制劈伴。

反應器Reactor

在事件驅動的應用中,將一個或多個客戶的服務請求分離(demultiplex)和事件分發(fā)器 (dispatch)給應用程序握爷。
上下文
在事件驅動的應用中跛璧,同步地、有序地處理同時接收的多個服務請求新啼。

問題
在分布式系統(tǒng)尤其是服務器這一類事件驅動應用中追城,雖然這些請求最終會被序列化地處理,但是必須時刻準備著處理多個同時到來的服務請求燥撞。在實際應用中座柱,這些請求總是通過一個事件(如CONNECTOR、READ物舒、WRITE等)來表示的色洞。在有 序地處理這些服務請求之前,應用程序必須先分離和調度這些同時到達的事件茶鉴。為了有效地解決這個問題锋玲,我們需要做到以下4方面: 
為了提高系統(tǒng)的可測量性和反應時間,應用程序不能長時間阻塞在某個事件源上而停止對其他事件的處理涵叮,這樣會嚴重降低對客戶端的響應度惭蹂。 
為了提高吞吐量,任何沒有必要的上下文切換割粮、同步和CPU之間的數據移動都要避免盾碗。 
引進新的服務或 改良已有的服務都要對既有的事件分離和調度機制帶來盡可能小的影響。 
大量的應用程序代碼需要隱藏在復雜的多線程和同步機制之后舀瓢。
解決方案
在一個或多個事件源上等待事件的到來廷雅,例如,一個已經連接的Socket描述符就是一個事件源京髓。
將事件的分離和調度整合到處理它的服務中航缀,而將分離和調度機制從應用程序對特定事件的處理中分離開,
也就是說分離和調度機制與特定的應用程序無關堰怨。 
具體來說芥玉,每個應用程序提供的每個服務都有一個獨立的事件處理器與之對應。
由 事件處理器處理來自事件源的特定類型的事件备图。每個事件處理器都事先注冊到Reactor管理器中灿巧。
Reactor管理器使用同步事件分離器在一個或多個事件源中等待事件的發(fā)生赶袄。
當事件發(fā)生后,同步事件分離器通知Reactor管理器抠藕,最后由Reactor管理器調度和該事件相關的事件處理器來完成請求的服務饿肺。
結構

在Reactor模式中,有5個關鍵的參與者盾似。
描述符(handle):

由操作系統(tǒng)提供敬辣,用于識別每一個事件,如Socket描述符零院、文 件描述符等购岗。在Linux中,它用一個整數來表示门粪。
事件可以來自外部,如來自客戶端 的連接請求烹困、數據等玄妈。事件也可以來自內部,如定時器事件髓梅。

同步事件分離器 (demultiplexer):

是一個函數拟蜻,用來等待一個或多個事件的發(fā)生。調用者會被阻 塞枯饿,直到分離器分離的描述符集上有事件發(fā)生酝锅。
Linux的select函數是一個經常被使 用的分離器。

事件處理器接口(event handler):

是由一個或多個模板函數組成的接口奢方。這些模板函數描述了和應用程序相關的對某個事件的操作搔扁。具體的事件處理器:是事件處理器接口的實現。它實現了應用程序提供的某個服務蟋字。每個具體的事件處理器總和一個描述符相關稿蹲。它使用描述符來識別事件、識別應用程序提供的服務鹊奖。

Reactor管理器(reactor):

定義了一些接口苛聘,用于應用程序控制事件調度,以及應用程序注冊忠聚、刪除事件處理器和相關的描述符设哗。
它是事件處理器的調度核心。Reactor管理器使用同步事件分離器來等待事件的發(fā)生两蟀。一旦事件發(fā)生网梢,Reactor管理器先是分離每個事件,然后調度事件處理器垫竞,最后調用相關的模板函 數來處理這個事件澎粟。
通過上述分析蛀序,我們注意到,是Reactor管理器而不是應用程序負責等待事件活烙、分離事件和調度事件徐裸。
實際上,Reactor管理器并沒有被具體的事件處理器調用啸盏,而是管理器調度具體的事件處理器重贺,由事件處理器對發(fā)生的事件做出處理。
這就是類似Hollywood原則的“反向控制”回懦。應用程序要做的僅僅是實現一個具體的事件處理器气笙,然后把它注冊到Reactor管理器中。
接下來的工作由管理 器來完成怯晕。
image.png

注意:這里提及的反應堆模型潜圃,實際上就是外國人設計的一個概念,將我們從面向過程編程轉換為一個面向對象編程的一個東西舟茶,我們可以簡單的認為谭期,直接操作IO模型,是一個面向過程的操作吧凉,而由一個反應堆來操作的隧出,是一個面向對象的操作,期間阀捅,面相對象操作會提高部分性能胀瞪。


image.png

Reactor包含如下角色:
1.Handle 句柄;用來標識socket連接或是打開文件饲鄙;
2.Synchronous Event Demultiplexer:同步事件多路分解器:由操作系統(tǒng)內核實現的一個函數凄诞;用于阻塞等待發(fā)生在句柄集合上的一個或多個事件;(如select/epoll忍级;)
3.Event Handler:事件處理接口
4.Concrete Event HandlerA:實現應用程序所提供的特定事件處理邏輯幔摸;
5.Reactor:反應器,定義一個接口颤练,實現以下功能:
1)供應用程序注冊和刪除關注的事件句柄既忆;
2)運行事件循環(huán);
3)有就緒事件到來時嗦玖,分發(fā)事件到之前注冊的回調函數上處理患雇;

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宇挫,隨后出現的幾起案子苛吱,更是在濱河造成了極大的恐慌,老刑警劉巖器瘪,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翠储,死亡現場離奇詭異绘雁,居然都是意外死亡,警方通過查閱死者的電腦和手機援所,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門庐舟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人住拭,你說我怎么就攤上這事挪略。” “怎么了滔岳?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵杠娱,是天一觀的道長。 經常有香客問我谱煤,道長摊求,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任刘离,我火速辦了婚禮睹簇,結果婚禮上,老公的妹妹穿的比我還像新娘寥闪。我一直安慰自己,他們只是感情好磨淌,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布疲憋。 她就那樣靜靜地躺著,像睡著了一般梁只。 火紅的嫁衣襯著肌膚如雪缚柳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天搪锣,我揣著相機與錄音秋忙,去河邊找鬼。 笑死构舟,一個胖子當著我的面吹牛灰追,可吹牛的內容都是我干的。 我是一名探鬼主播狗超,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼弹澎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了努咐?” 一聲冷哼從身側響起苦蒿,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渗稍,沒想到半個月后佩迟,有當地人在樹林里發(fā)現了一具尸體团滥,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年报强,在試婚紗的時候發(fā)現自己被綠了灸姊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡躺涝,死狀恐怖厨钻,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情坚嗜,我是刑警寧澤夯膀,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站苍蔬,受9級特大地震影響诱建,放射性物質發(fā)生泄漏。R本人自食惡果不足惜碟绑,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一俺猿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧格仲,春花似錦押袍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侮东,卻和暖如春圈盔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悄雅。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工驱敲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宽闲。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓众眨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親容诬。 傳聞我的和親對象是個殘疾皇子围辙,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容