libevent 源码深度剖析
张亮
Email: sparling.liang@hotmail.com
1
1 / 44
回想刚开始写时,就冠以“深度剖析”的名称,也是为了给自己一些压力,以期能写好
这一系列文章,对 libevent 源代码的各方面作详细的分析;现在看来也算是达到了最初的目
的。希望能给学习和使用 libevent 的朋友们有所帮助。
Email:sparkling.liang@hotmail.com
张亮
2
2 / 44
目录
libevent源码深度剖析......................................................................................................................1
目录 ..................................................................................................................................................3
一 序幕.............................................................................................................................................5
1 前言...............................................................................................................................5
2 Libevent简介 .................................................................................................................5
3 学习的好处...................................................................................................................5
二Reactor模式 ..................................................................................................................................6
1 Reactor的事件处理机制 ...............................................................................................6
2 Reactor模式的优点 .......................................................................................................6
3 Reactor模式框架 ...........................................................................................................6
4 Reactor事件处理流程 ...................................................................................................8
5 小结...............................................................................................................................9
三 基本使用场景和事件流程.......................................................................................................10
1 前言.............................................................................................................................10
2 基本应用场景.............................................................................................................10
3 实例代码.....................................................................................................................11
4 事件处理流程.............................................................................................................11
5 小结.............................................................................................................................12
四 libevent源代码文件组织..........................................................................................................13
1 前言.............................................................................................................................13
2 源代码组织结构.........................................................................................................13
3 小结.............................................................................................................................14
五 libevent的核心:事件event .....................................................................................................15
1 libevent的核心-event...................................................................................................15
2 libevent对event的管理 ................................................................................................16
3 事件设置的接口函数.................................................................................................17
4 小结.............................................................................................................................18
六 初见事件处理框架...................................................................................................................19
1 事件处理框架-event_base..........................................................................................19
2 创建和初始化event_base ...........................................................................................20
3 接口函数.....................................................................................................................20
4 小节.............................................................................................................................23
七 事件主循环...............................................................................................................................24
1 阶段性的胜利.............................................................................................................24
2 事件处理主循环.........................................................................................................24
3 I/O和Timer事件的统一...............................................................................................27
4 I/O和Signal事件的统一 ..............................................................................................27
5 小节.............................................................................................................................27
八 集成信号处理...........................................................................................................................28
1 集成策略——使用socket pair ...................................................................................28
3
3 / 44
2 集成到事件主循环——通知event_base ...................................................................29
4 evsignal_info结构体....................................................................................................30
5 注册、注销signal事件 ...............................................................................................30
5 小节.............................................................................................................................31
九 集成定时器事件.......................................................................................................................32
1 集成到事件主循环.....................................................................................................32
2 Timer小根堆 ................................................................................................................33
3 小节.............................................................................................................................34
十 支持I/O多路复用技术 .............................................................................................................35
1 统一的关键.................................................................................................................35
2 设置I/O demultiplex机制 ...........................................................................................35
3 小节.............................................................................................................................37
十一 时间管理...............................................................................................................................38
1 初始化检测.................................................................................................................38
2 时间缓存.....................................................................................................................38
3 时间校正.....................................................................................................................40
4 小节.............................................................................................................................41
十二 让libevent支持多线程..........................................................................................................42
1 错误使用示例.............................................................................................................42
2 支持多线程的几种模式.............................................................................................42
3 例子——memcached..................................................................................................43
4 小节.............................................................................................................................44
4
4 / 44
一 序幕
1 前言
Libevent 是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不
少。写这一系列文章的用意在于,一则分享心得;二则对 libevent 代码和设计思想做系统的、
更深层次的分析,写出来,也可供后来者参考。
附带一句:Libevent 是用 c 语言编写的(MS 大牛们都偏爱 c 语言哪),而且几乎是无处
不函数指针,学习其源代码也需要相当的 c 语言基础。
2 Libevent 简介
上来当然要先夸奖啦,Libevent 有几个显著的亮点:
事件驱动(event-driven),高性能;
轻量级,专注于网络,不如 ACE 那么臃肿庞大;
源代码相当精炼、易读;
跨平台,支持 Windows、Linux、*BSD 和 Mac Os;
支持多种 I/O 多路复用技术, epoll、poll、dev/poll、select 和 kqueue 等;
支持 I/O,定时器和信号等事件;
注册事件优先级;
Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、Vo m i t 、Nylon、Netchat
等等。
Libevent 当前的最新稳定版是 1.4.13;这也是本文参照的版本。
3 学习的好处
学习 libevent 有助于提升程序设计功力,除了网络程序设计方面外,Libevent 的代码里
有很多有用的设计技巧和基础数据结构,比如信息隐藏、函数指针、c 语言的多态支持、链
表和堆等等,都有助于提升自身的程序功力。
程序设计不止要了解框架,很多细节之处恰恰也是事关整个系统成败的关键。只对
libevent 本身的框架大概了解,那或许仅仅是一知半解,不深入代码分析,就难以了解其设
计的精巧之处,也就难以为自己所用。
事实上 Libevent 本身就是一个典型的 Reactor 模型,理解 Reactor 模式是理解 libevent
的基石;因此下一节将介绍典型的事件驱动设计模式——Reactor 模式。
参考资料:
Libevent:
http://monkey.org/~provos/libevent/
5
5 / 44