异步事件开发库-libev
2012-10-08 17:26:12 阿炯

libev是高性能事件循环/事件模型的网络库,由C语言实现并且包含大量新特性。它是继libevent和Perl Event module之后的一套全新网络库。它追求的目标:速度更快,bug更少,特性更多,体积更小。与libevent很像,按照作者由Marc Lehmann和Emanuele Giaquinta的介绍,可以作为libevent的替代者,能够提供更高的性能,并不需要复杂的配置。目前能在多个平台下提供高性能后端支持,在GPLv2协议下授权。

A full-featured and high-performance event loop that is loosely modelled after libevent, but without its limitations and bugs. It is used in GNU Virtual Private Ethernet, rxvt-unicode, auditd, the Deliantra MORPG Server and Client, and many other programs.


与libevent的区别
在设计理念上,创建libev是为了改进libevent中的一些架构决策,例如:
全局变量的使用使得在多线程环境中很难安全地使用libevent。
观察器结构很大,因为它们将输入/输出、时间和信号处理程序合二为一。
额外的组件(如http和dns服务器)的实现质量参差不齐。
计时器不精确,不能很好地处理时间跳跃。

libev的解决方案是:
不使用全局变量,而是每个函数都有一个循环上下文。
对每种事件类型使用小的观察器(一个I/O观察器在x86_64机器上使用56字节,而用libevent的话使用136字节)。
没有http库等组件。libev的功能非常少。
允许更多事件类型,例如基于wall clock或者单调时间的定时器、线程间中断等等。

更简单地说,libev的设计遵循UNIX工具箱的哲学,尽可能好地只做一件事。

libev不支持Windows的IOCP。


最新版本:4.27
这个版本主要增加了一个新的后端,"Linux AIO",它使用了新的Linux 4.18引入的事件轮询机制。它目前在默认情况下不会被使用,除非您明确向标志添加EVBACKEND_LINUXAIO或通过设置LIBEV_FLAGS环境变量。

Linux AIO后端可能会在后期添加到推荐后端当中并且优先于epoll(可能是4.28)。如果Linux AIO可用将会使用它,否则会自动回退到epoll和poll/select的后端实现,你可以像这样运行它:
LIBEV_FLAGS = 127 ./myprog

可以这样来尝试强制使用Linux AIO:
LIBEV_FLAGS = 64 ./myprog

4.27 更新
近乎完全重写的Linux AIO, 解决了诸多的限制.
在Linux AIO的后端中还强制依赖一些epoll实现(epoll backend now mandatory for linux aio backend).
对于无效的fd(文件描述符)会在事件循环中进行断言而非之前的默默丢弃.
当EV_VERIFY宏定义为2或更高的时候, 会在ev_io_start/ev_io_stop中使用系统调用验证观察者fd.

4.26 更新
更新libecb至0x00010006.
新的实验性Linux AIO后端(linux 4.18+).
删除了ev_once中的冗余检查.
更新ev_set_allocator文档.
通过array_needsize_noinit替换了EMPTY2宏.
epoll后端在fork之后使用epoll_create1进行创建.
一些不重要的代码清理工作.


项目主页:http://software.schmorp.de/pkg/libev.html