libevent - libev 和 libevent 有什么区别?

标签 libevent libev

这两个库都是为异步 I/O 调度而设计的,并且都在 Linux 上使用 epoll,在 FreeBSD 上使用 kqueue 等。

除了表面上的差异,我的意思是这两个库之间真正的差异是什么?关于架构,还是设计理念?

最佳答案

就设计理念而言,libev 的创建是为了改进 libevent 中的一些架构决策,例如,全局变量的使用使得在多线程环境中安全使用 libevent 变得困难,观察者结构很大,因为它们结合了 I/O,时间和信号处理程序合二为一,额外的组件(例如 http 和 dns 服务器)遭受了糟糕的实现质量和由此产生的安全问题,并且计时器不精确并且不能很好地应对时间跳跃。

Libev 试图改进其中的每一个,不使用全局变量,而是对所有函数使用循环上下文,对每种事件类型使用小型观察程序(I/O 观察程序在 x86_64 上使用 56 个字节,而 libevent 则使用 136 个字节) ,允许额外的事件类型,例如基于挂钟与单调时间的计时器、线程间中断、准备和检查观察者以嵌入其他事件循环或被嵌入等等。

额外的组件问题通过根本没有它们来“解决”,因此 libev 可以小而高效,但您还需要在其他地方寻找 http 库,因为 libev 根本没有(例如,有一个非常相关的库,称为 libeio,它可以执行异步 I/O,它可以独立使用,也可以与 libev 一起使用,因此您可以混合搭配)。

简而言之,libev 尝试只做一件事(POSIX 事件库),并且以最有效的方式进行。 Libevent 试图为您提供完整的解决方案(事件库、非阻塞 I/O 库、http 服务器、DNS 客户端)。

或者,更短地说,libev 尝试遵循 UNIX 工具箱哲学,即只做一件事,尽可能好。

请注意,这是设计理念,我可以权威地陈述它,因为我设计了 libev。这些设计目标是否真正达到,或者其理念是否基于合理的原则,都由您来判断。

2017 年更新:

我多次被问到我所指的计时器不精确是什么,以及为什么 libev 不支持 Windows 上的 IOCP。

对于计时器,libevent 会根据 future 某个未知的基准时间来安排计时器,而您却浑然不知。 Libev 可以提前告诉你它将使用什么基准时间来调度定时器,这使得程序可以同时使用 libevent 方法和 libev 方法。此外,libevent 有时会提前使计时器过期,具体取决于后端。前者是一个 API 问题,后者是可以修复的(并且可能已经修复了 - 我没有检查)。

至于 IOCP 支持 - 我认为无法做到,因为 IOCP 根本不够强大。一方面,它们需要一种特殊的套接字类型,这将进一步限制 Windows 上允许的句柄集(例如,perl 使用的 sopcket 是 IOCP 的“错误”类型)。此外,IOCP 根本不支持 I/O 就绪事件,它们只能执行实际的 I/O。对于某些句柄类型,有一些解决方法,例如执行虚拟 0 字节读取,但同样,这将进一步限制您可以在 Windows 上使用的句柄类型,而且将依赖于可能不被所有套接字提供程序共享的未记录的行为.

据我所知,没有其他事件库支持 Windows 上的 IOCP。 libevent 的作用是,除了事件库之外,它还允许您对读/写操作进行排队,然后可以通过 IOCP 完成这些操作。由于 libev 不为您执行 I/O,因此无法在 libev 本身中使用 IOCP。

这确实是设计使然 - libev 试图变得小并且类似于 POSIX,而 Windows 根本没有有效的方法来获取 POSIX 风格的 I/O 事件。如果 IOCP 很重要,您要么必须自己使用它们,要么使用许多其他为您执行 I/O 的框架,因此可以使用 IOCP。

关于libevent - libev 和 libevent 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9433864/

相关文章:

boost-thread - 雇用,libev和boost:threads

http - 我应该调用 evhttp_request_free 来释放 http 服务器中的资源吗?

c++ - malloc 不应该是异步的吗?

cppunit - 如何为 libevent 管理的事件驱动应用程序编写单元测试?

c - libev 循环在空闲时使用 99% 的 CPU

c - 为什么有人会为第一个参数定义宏,包括 C 中的逗号?

c++ - libevent 的附加值

c++ - 带有 libevent 的多线程 HTTP 服务器

C/libev : program closes when event is triggered

perl - 在 EV (perl) 中使用合成文件句柄