C++學(xué)習(xí)筆記(十六) - 典型的事件驅(qū)動(dòng)設(shè)計(jì)模式-Reactor模式

參考文獻(xiàn):libevent源碼深度剖析二
這是libevent學(xué)習(xí)過(guò)程的一個(gè)基礎(chǔ)補(bǔ)充

1 Reactor的事件處理機(jī)制

普通的函數(shù)調(diào)用機(jī)制的流程是這樣的:調(diào)用函數(shù)-函數(shù)執(zhí)行-返回結(jié)果-程序繼續(xù)處理
Reactor則是一種事件驅(qū)動(dòng)的機(jī)制,這在C#,Qt等程序中都有所體現(xiàn),即應(yīng)用程序提供接口注冊(cè)到Reactor上,相應(yīng)的事件發(fā)生時(shí),Reactor自動(dòng)調(diào)用這個(gè)接口,這個(gè)接口也被稱為“回調(diào)函數(shù)”。

2 Reactor模式的優(yōu)點(diǎn)

Reactor模式是編寫高性能網(wǎng)絡(luò)服務(wù)器的必備技術(shù)之一,它具有如下的優(yōu)點(diǎn):
1)響應(yīng)快,不必為單個(gè)同步時(shí)間所阻塞,雖然Reactor本身依然是同步的;
2)編程相對(duì)簡(jiǎn)單,可以最大程度的避免復(fù)雜的多線程及同步問(wèn)題,并且避免了多線程/進(jìn)程的切換開銷;
3)可擴(kuò)展性,可以方便的通過(guò)增加Reactor實(shí)例個(gè)數(shù)來(lái)充分利用CPU資源;
4)可復(fù)用性,reactor框架本身與具體事件處理邏輯無(wú)關(guān),具有很高的復(fù)用性;

3 Reactor模式框架

使用Reactor框架,必備的幾個(gè)組件:事件源,Reactor框架,多路復(fù)用機(jī)制和事件處理程序,先來(lái)看看Reactor模型的整體框架:

整體框架

1)事件源
描述符由操作系統(tǒng)提供,用于識(shí)別每一個(gè)事件,如Socket描述符、文 件描述符等。在Linux中,它用一個(gè)整數(shù)來(lái)表示。事件可以來(lái)自外部,如來(lái)自客戶端 的連接請(qǐng)求、數(shù)據(jù)等。事件也可以來(lái)自內(nèi)部,如定時(shí)器事件。
Linux上是一個(gè)整數(shù)的描述符,Windows上就是Socket或者Handle,程序在指定的句柄上注冊(cè)關(guān)心的事件。
2)event demultiplexer——事件多路分發(fā)機(jī)制
是一個(gè)函數(shù),用來(lái)等待一個(gè)或多個(gè)事件的發(fā)生。調(diào)用者會(huì)被阻 塞,直到分離器分離的描述符集上有事件發(fā)生。Linux的select函數(shù)是一個(gè)經(jīng)常被使 用的分離器。
程序首先將其關(guān)心的句柄及事件注冊(cè)到event demultiplexer上,當(dāng)有事件到達(dá)時(shí),event demultiplexer會(huì)發(fā)出通知“在已經(jīng)注冊(cè)的句柄集中,一個(gè)或多個(gè)句柄的事件已經(jīng)就緒”,程序收到通知后,就可以在非阻塞的情況下對(duì)事件進(jìn)行處理了。
3)Reactor——反應(yīng)器
Reactor,是事件管理的接口,內(nèi)部使用event demultiplexer注冊(cè)、注銷事件;并運(yùn)行事件循環(huán),當(dāng)有事件進(jìn)入“就緒”狀態(tài)時(shí),調(diào)用注冊(cè)事件的回調(diào)函數(shù)處理事件。
對(duì)應(yīng)到libevent中,就是event_base結(jié)構(gòu)體。
一個(gè)典型的Reactor聲明方式:

    class Reactor  
    {  
    public:  
        int register_handler(Event_Handler *pHandler, int event);  
        int remove_handler(Event_Handler *pHandler, int event);  
        void handle_events(timeval *ptv);  
        // ...  
    };  

4) Event Handler——事件處理程序
事件處理程序提供了一組接口,每個(gè)接口對(duì)應(yīng)了一種類型的事件,供Reactor在相應(yīng)的事件發(fā)生時(shí)調(diào)用,執(zhí)行相應(yīng)的事件處理。通常它會(huì)綁定一個(gè)有效的句柄。
對(duì)應(yīng)到libevent中,就是event結(jié)構(gòu)體。
下面是兩種典型的Event Handler類聲明方式,二者互有優(yōu)缺點(diǎn)。

    class Event_Handler  
    {  
    public:  
        virtual void handle_read() = 0;  
        virtual void handle_write() = 0;  
        virtual void handle_timeout() = 0;  
        virtual void handle_close() = 0;  
        virtual HANDLE get_handle() = 0;  
        // ...  
    };  
    class Event_Handler  
    {  
    public:  
        // events maybe read/write/timeout/close .etc  
        virtual void handle_events(int events) = 0;  
        virtual HANDLE get_handle() = 0;  
        // ...  
    };  

4 Reactor事件處理流程

事件處理流程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,540評(píng)論 19 139
  • 轉(zhuǎn)自http://blog.csdn.net/xugangwen/article/details/44811783...
    扎Zn了老Fe閱讀 13,077評(píng)論 1 142
  • 本文是Netty文集中“Netty 那些事兒”系列的文章。主要結(jié)合在開發(fā)實(shí)戰(zhàn)中,我們遇到的一些“奇奇怪怪”的問(wèn)題,...
    tomas家的小撥浪鼓閱讀 15,925評(píng)論 3 35
  • 這一年,我畢業(yè)了 之前的生活,簡(jiǎn)直就是張白紙,似乎除了吃飯睡覺(jué)就是學(xué)習(xí)了。 初入職場(chǎng),我手足無(wú)措,唯一的感覺(jué)就是無(wú)...
    朢文閱讀 237評(píng)論 0 1
  • 半夜3點(diǎn),電話響了。一哥們打來(lái)電話說(shuō):兄弟,我車?yán)飽|西被偷了。我說(shuō):哥們那先報(bào)警啊。哥們說(shuō):不是啥值錢的玩意,方向...
    FC展翅飛翔閱讀 196評(píng)論 0 0

友情鏈接更多精彩內(nèi)容