修改记录:
3-28 初稿
3-39 补充了全局变量说明,补充了0.2的内容
libevent是一个高性能的异步处理函数库。使用libevent库的著名软件有chromium、memcached、Tor等等。
网上libevent的中文文档不是很少,其中
张亮写的libevent源码分析写得不错。但是当时的1.4版本篇幅还是过长,本文将浅析libevent的0.1及0.2版本,其中体现了libevent最基础的东西,希望能给诸位一个快速的印象。
还是请注意,现在的libevent2与之前的版本很不一样了。
基本类型
libevent最基础的数据类型是event
struct event {
TAILQ_ENTRY (event) ev_read_next;
TAILQ_ENTRY (event) ev_write_next;
TAILQ_ENTRY (event) ev_timeout_next;
TAILQ_ENTRY (event) ev_add_next;
int ev_fd; //包含的socket套接字,是event的核心
short ev_events; //对应的事件集
struct timeval ev_timeout; //定时器
void (*ev_callback)(int, short, void *arg); //对应的回调函数
void *ev_arg; //参数
int ev_flags; //标志
};
这里最难理解的就是TAILQ_ENTRY了,这个宏是定义在queue.h文件当中
#define TAILQ_ENTRY(type) \
struct { \
struct type *tqe_next; /* next element */ \
struct type **tqe_prev; /* address of previous next element */ \
}
从宏定义可以看出,此结构体没有名字,所以只能在某一个结构体中被使用(这里就是struct event)
这里定义的是一个tail queue的结构,该结构比较好玩,本人之前把它误想成双向链表了,但仔细看看,似乎还不全是。
tqe_next很常见,指向下一个元素
tqe_prev是 前面一个元素当中 指向下一个元素的 那个指针的指针……所以有2个星号。(在写本文之时,我还不清楚为什么要这么绕)
回过头来看,
ev_read_next可以用来找到在队列中下一个可以准备读的套接字
ev_write_next可以用来找到在队列中下一个可以准备写的套接字
ev_timeout_next可以用来找到在队列中下一个定时器
ev_add_next可以用来找到在队列中下一个需要处理的事件
0.2版本中增加了提供多平台网络编程的包装结构
struct eventop {
char *name;
void *(*init)(void);
int (*add)(void *, struct event *); //事件增加的回调函数,下同,全字面意思不解释
int (*del)(void *, struct event *);
int (*recalc)(void *, int);
int (*dispatch)(void *, struct timeval *);
};
全局变量
刚才说到队列,可是在使用库的时候,哪来得队列呢?
这是在event.c文件中已经定义的全局变量
TAILQ_HEAD (timeout_list, event) timequeue; //定时器队列的头结点
TAILQ_HEAD (event_wlist, event) writequeue; //写队列的头结点
TAILQ_HEAD (event_rlist, event) readqueue; //读队列的头结点
TAILQ_HEAD (event_ilist, event) addqueue; //待处理队列的头结点
其中timequeue这个定时器队列是按照结构体timeval从小到大的顺序进行排列的,后面增加事件时会提到。
int event_inloop = 0; //锁。用于判断程序此时是否在轮询之中
int event_fds; /* Highest fd in fd set */
int event_fdsz; //size。用于计算event_fds总共要用多大空间
fd_set *event_readset; //对应于select的readset
fd_set *event_writeset; //对应于select的writeset
0.2版本中增加的全局变量
struct eventop *evsel;
void *evbase;
event.c当中存在一个全局数组struct eventop *eventops[]用于指示系统当中有以下哪些网络处理函数可使用:kqueue, epoll, poll, select等等。
然后程序会选择一个传给evsel
evsel会调用初始化函数返回一个指向网络处理函数结构体的指针给evbase。
分享到:
相关推荐
为方便阅读,把blog上的libevent源码深度剖析系列文章整合成一个pdf。
libevent定义了一系列通用的类型和函数,如兼容类型、定长位宽类型、有符号类型size_t、偏移类型、socket类型、socklen_t类型指针类型兼容函数,以及时间函数、socketAPI函数等。 21. 连接监听器evconnlistener ...
对于想要了解事件驱动编程和libevent的人来说,“libevent v0.1”是一个很好的起点。同时,对于那些对低级别网络编程和服务器架构感兴趣的开发者,这个版本也是一个不错的实践项目。通过研究这个版本,你可以深入...
libevent的原理和源码分析对于深入理解网络编程的底层机制至关重要。 首先,libevent的核心是其事件模型。它基于事件驱动编程模型,这种模型能够高效地处理大量并发连接。当有事件发生时,libevent会调用相应的回调...
6. **源码解析**:深入阅读libevent的源码,可以理解其内部实现细节,如事件调度算法、多线程支持和异步I/O处理等。 7. **性能优化**:libevent提供了很多配置选项来优化性能,例如选择合适的事件模型、使用多线程...
Libevent 源码解析 Libevent 是一个高性能的事件驱动库,广泛应用于网络编程和高性能服务器开发中。下面是对 Libevent 源码的深入剖析,涵盖了其架构设计、事件处理机制、Reactor 模式、事件循环、IO multiplexing...
Libevent是一款高性能的事件通知库,最初由Nick Mathewson和George V. Reilly开发,广泛应用于需要处理多个事件源的网络编程中。该库支持多种操作系统,为跨平台编程提供便利,例如在Linux、BSD、Mac OS X以及...
libevent-1.0c.tar.gz [GPG Sig] - Release 2005-04-03 Bug fixes for Windows, Solaris and improved logging interface. libevent-1.0b.tar.gz [GPG Sig] - Release ...libevent-0.1.tar.gz - Release 2000-11-14
《深入解析libevent-1.0b:多线程网络通信库的...通过理解和掌握libevent的源码,开发者能够构建出更高效、可靠的网络服务。无论是对初学者还是经验丰富的程序员,libevent都是一个值得深入学习和研究的优秀开源项目。
《libevent源码深度剖析》一书主要针对的是libevent这一开源库进行深入解析,旨在帮助读者理解并掌握libevent的核心原理与应用。libevent是一个事件通知库,它允许程序员以一种统一的方式来处理各种类型的I/O事件和...
libevent库,文字版,很清晰,附带libevent参考手册(中文版) libevent源码深度剖析,根据libevent开源代码框架进行剖析,很不错值得学习借鉴,还有libevent中C语言的功底值得学习揣摩!
通过深入理解和使用libevent源码,开发者可以更好地定制自己的网络应用,实现高效、稳定的服务。 总结,libevent是一个强大的工具,它提供了事件驱动的编程模型,适用于处理大量并发连接。通过理解并熟练运用...
标题中的“jm源码”和“libevent源码”指的是两个知名的开源项目,分别是JM(可能是Java Microservices的简称)和Libevent。这两个组件在IT领域,尤其是网络编程和服务器开发中扮演着重要角色。 首先,让我们深入...
**libevent库详解** ...总之,libevent是一个强大且灵活的事件库,其源码对于深入理解和实现高性能并发服务非常有价值。通过学习libevent,开发者可以掌握网络编程、事件驱动编程以及系统级优化等多个领域的知识。
《libevent参考手册(中文版)》和《libevent源码深度剖析》是两本针对libevent库的重要参考资料。libevent是一个开源的事件通知库,它使得开发者能够编写高性能、可扩展的网络服务器或者客户端应用。这个库的核心...
libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名的用于apache的php缓存库memcached据说也是libevent based,而且libevent在使用...
Libevent 是一个强大的事件通知库,它用于处理网络上的异步事件。在Windows环境下,如VS2008,你可以使用Libevent来构建高性能的客户端和服务端应用。本项目是基于VS2008和libevent库创建的一个示例,旨在帮助开发者...
libevent-1.0d.tar.gz [GPG Sig] - Release 2005-04-22 Several minor bug fixes and building of shared libraries. libevent-1.0c.tar.gz [GPG Sig] - Release 2005-04...libevent-0.1.tar.gz - Release 2000-11-14
标题"libevent源码和一个小例子"指的是一个关于libevent库的源代码分析以及如何使用它的具体示例。Libevent是一个事件通知库,它用于编写高性能的网络服务器,处理TCP、UDP、HTTP、SSL和其他IO事件。在给定的描述中...