1,libevent簡介
libevent是一個輕量級的基於事件驅動的高性能的開源網絡庫,並且支持多個平臺,對多個平臺的I/O複用技術進行了封裝,當我們編譯庫的代碼時,編譯的腳本將會根據OS支持的處理事件機制,來編譯相應的代碼,從而在libevent接口上保持一致。
2,even_base
libevent默認情況下是單線程的,可以配置成多線程,每個線程有且只有一個event_base,對應一個struct event_base結構體以及附於其上的事件管理器,用來調度託管給它的一系列event,可以和操作系統的進程管理類比。當一個事件發生後,event_base會在合適的時間,不一定是立即去調用綁定在這個事件上的函數,直到這個函數執行完,再去調度其他的事件。
一個event_base上有兩個鏈表:一條用於鏈接它管理所有的event;一條用於鏈接所有激活的event。
還有一個最小堆用於管理超時事件。
struct event_base {
const struct eventop *evsel; /* 表示IO複用爲哪種類型 */
void *evbase;
int event_count; /* counts number of total events 事件的總數 */
int event_count_active; /* counts number of active events 激活事件的總數 */
int event_gotterm; /* Set to terminate loop */
int event_break; /* Set to terminate loop immediately */
/* active event management */
struct event_list **activequeues; /* 激活事件的鏈表 */
int nactivequeues; /*激活鏈表是個二維的,表示激活鏈表數,可理解爲行數,每一行掛的都是激活事*/
/* signal handling info */
struct evsignal_info sig;
struct event_list eventqueue; /* 事件的鏈表 */
struct timeval event_tv;
struct min_heap timeheap; /* 管理超時事件的最小堆 */
struct timeval tv_cache;
};
3,何爲事件
libevent 用 struct event 結構體表示一個事件,事件分爲三種:
IO事件;
信號事件;
定時器超時事件。
event 結構體必然要有對應的成員能夠鏈接進event_base 裏鏈表,以及最小堆索引指示它在event_base最小堆中的位置。