首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libev和libevent有什么区别?

libev和libevent有什么区别?
EN

Stack Overflow用户
提问于 2012-02-24 23:58:58
回答 2查看 41K关注 0票数 100

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

除了表面上的区别,我的意思是这两个库之间的真正区别是什么?关于架构,还是设计哲学?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-22 11:32:40

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

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

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

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

或者,简而言之,libev试图遵循UNIX工具箱的哲学,即只做一件事,尽可能好。

请注意,这是设计哲学,我可以权威地陈述,因为我设计了libev。这些设计目标是否真的达到了,或者哲学是否基于合理的原则,取决于你的判断。

更新2017:

我多次被问到我所说的计时器不精确,为什么libev在windows上不支持IOCP。

至于计时器,libevent会在你不知道的情况下,相对于一些未知的基准时间来安排计时器。Libev可以提前告诉您它将使用什么基准时间来调度计时器,这允许程序同时使用libevent方法和libev方法。此外,libevent有时会提前使计时器过期,这取决于后端。前者是一个API问题,后者是可以修复的(并且可能已经修复,因为-我没有检查)。

至于IOCP支持--我不认为这是可行的,因为IOCP的功能还不够强大。首先,它们需要一个特殊的套接字类型,这将进一步限制windows上允许的句柄集合(例如,perl使用的sopckets对于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。

票数 232
EN

Stack Overflow用户

发布于 2013-09-10 21:51:17

对我来说,libevent的最大优势是内置的OpenSSL支持。Bufferevent接口是在2.0版本的libevent Bufferevent中引入的,它几乎可以轻松地为开发人员处理安全连接。也许我的知识已经过时了,但似乎libev不支持这一点。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9433864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档