Libevent 是一个轻量级的高性能网络库,事件驱动,基于 Reactor 模式。
对 Libevent 源码的阅读可围绕事件管理展开:
Libevent 对三类事件源进行了统一,用 event
结构体表示,每个 event
实例表示一个事件。
同时监听多个事件(比如监听多个 socket 上的可读事件),必然会有多个 event
实例,对这些 event
实例进行管理需要特定的数据结构,Libevent 使用了尾队列(本质上是双向链表)和小根堆管理所有事件。
各个数据结构的用途如下:
- 已注册事件队列:所有事件添加时都会被插入到已注册事件队列
- 激活事件队列:事件触发后,被插入激活事件队列
- 信号事件队列:信号事件添加时会插入信号事件队列
- 小根堆:定时器事件用小根堆管理,堆顶的定时器事件是超时时间最小的(最先超时)
向 Reactor(对应源码中的 event_base
) 中添加I/O、定时事件,需要调用 event_add
函数,信号事件调用 evsignal_add
,evsignal_add
最终也会调用 event_add
: