參考文獻(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事件處理流程
