libevent,libev,libuv都是c实现的异步事件库,注册异步事件,检测异步事件,根据事件的触发先后顺序,调用相对应回调函数处理事件。处理的事件包括:网络 io 事件、定时事件以及信号事件。这三个事件驱动着服务器的运行。
1. 网络io事件:
linux:epoll、poll、select
mac:kqueue
window:iocp
2. 定时事件:
红黑树
最小堆:二叉树、四叉树
跳表
时间轮
3. 信号事件
libevent 和 libev 主要封装了异步事件库与操作系统的交互简单的事件管理接口,让用户无需关注平台检测处理事件的机制的差异,只需关注事件的具体处理。
从设计理念出发,libev 是为了改进 libevent 中的一些架构决策;例如:全局变量的使用使得在多线程环境中很难安全地使用 libevent;event 的数据结构设计太大,它包含了 io、时间以及信号处理全封装在一个结构体中,额外的组件如 http、dns、openssl 等实现质量差(容易产生安全问题),计时器不精确,不能很好地处理时间事件;
libev 通过完全去除全局变量的使用,而是通过回调传参来传递上下文(后面libevent也这样做了);并且根据不同事件类型构建不同的数据结构,以此来减低事件耦合性;计时器使用最小四叉堆。libev 小而高效;只关注事件处理。
libevent 和 libev 对 window 支持比较差,由此产生了 libuv 库;libuv 基于 libev,在window 平台上更好的封装了 iocp;node.js 基于 libuv;
libevent
编译安装libevent
首先去git上下载release-2.1.12-stable.tar.gz
解压
root@wxf:/# tar -zxvf libevent-2.1.12-stable
root@wxf:/# cd libevent-2.1.12-stable/
执行配置./configure, 检测安装环境, 生成makefile.
执行./configure的时候也可以指定路径, ./configure --prefix=/usr/xxxxx,
这样就可以安装到指定的目录下, 但是这样在进行源代码编译的时候
需要指定用-I头文件的路径和用-L库文件的路径. 若默认安装不指定--prefix,
则会安装到系统默认的路径下, 编译的时候可以不指定头文件和库文件所在的路径.
root@wxf:/libevent-2.1.12-stable# ./configure
执行make命令编译整个项目文件
root@wxf:/libevent-2.1.12-stable# make
make install进行安装
头文件拷贝到了/usr/local/include目录下
库文件拷贝到了/usr/local/lib目录下
root@wxf:/libevent-2.1.12-stable# make install
使用libevent库编写代码在编译程序的时候需要指定库名:-levent。例如gcc hello-world.c -levent。由于安装的时候已经将头文件和库文件拷贝到了系统头文件所在路径/usr/local/include和系统库文件所在路径/usr/local/lib, 所以这里编译的时候可以不用指定-I和-L.