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最小堆中的位置。