libev和libevent有什么区别?
这两个库都是为asynchronousI / O调度而devise的,并且都在linux上运行epoll,在FreeBSD上运行kqueue等。
除了肤浅的差异之外,我的意思是这两个图书馆之间真正的区别是什么? 关于build筑学还是devise哲学?
至于devise哲学,libev是为了改进libevent中的一些架构决定而创build的,例如,全局variables的使用使得在multithreading环境中安全地使用libevent变得困难,观察者结构很大,因为它们结合了I / O,时间和信号在一个处理程序中,诸如http和dns服务器等额外的组件遭受了糟糕的实现质量和由此产生的安全问题,定时器不精确,并且不能很好地应对时间跳跃。
Libev试图通过不使用全局variables,而是对所有函数使用循环上下文,通过对每个事件types使用小型监视器(一个I / O监视器在x86_64上使用56个字节,而对于libevent使用56个字节),尝试改进其中的每一个,允许额外事件types,如基于wallclock与单调时间的定时器,线程间中断,准备和检查观察者embedded其他事件循环或embedded等等。
额外的组件问题根本就没有被解决,所以libev可以小而高效,但是你也需要在其他地方寻找一个http库,因为libev根本就没有这个问题(例如,有一个非常相关的库称为libeio,它可以独立使用asynchronousI / O,也可以与libev一起使用,因此可以混合使用)。
所以总之,libev试图只做一件事(POSIX事件库),并以最有效的方式做到这一点。 Libevent试图给你提供完整的解决scheme(事件库,非阻塞I / O库,http服务器,DNS客户端)。
或者,甚至更短,libev试图遵循UNIX工具箱只做一件事情的哲学,尽可能好。
请注意,这是devise理念,我可以权威地陈述,因为我devise了libev。 无论这些devise目标是否已经真正达到,或者这个哲学是否build立在合理的原则之上,都是由你来判断的。
2017年更新:
我被多次问到什么是定时器的不准确性,以及为什么libev不支持windows上的IOCP。
至于计时器,libevent计划相对于将来未知的基准时间的计时器,而不知道它。 Libev可以提前告诉你什么时候用它来安排定时器,这允许程序使用libevent方法和libev方法。 此外,libevent有时会过早定时器,这取决于后端。 前者是一个API问题,后者是可以修复的(并且可能已经修复 – 我没有检查)。
至于IOCP的支持 – 我不认为这是可以做到的,因为IOCP根本不够强大。 首先,它们需要一个特殊的套接字types,这会限制窗口上允许的句柄集(例如,perl使用的sopckets是IOCP的“错误”types)。 此外,IOCP根本不支持I / O就绪事件,它们只能做实际的I / O。 有些句柄types的解决方法,比如做一个0字节的虚拟读取,但是这又会限制你可以在windows上使用的句柄types,而且还会依赖于所有套接字提供者可能不共享的未logging行为。
据我所知,没有其他事件库支持Windows上的IOCP。 除了事件库之外,libevent的function还包括排队读/写操作,然后通过IOCP完成。 因为libev不为你做I / O,所以在libev本身就没有办法使用IOCP。
这确实是由devise – libev试图是小的和POSIX样,而Windows根本没有一种有效的方式来获得POSIX风格的I / O事件。 如果IOCP很重要,那么您必须自己使用它们,或者确实使用一些为您执行I / O的其他框架,因此可以使用IOCP。
libevent对我的巨大优势是内build的OpenSSL支持。 在libevent API的2.0版本中引入的Bufferevent接口,对于开发人员来说几乎毫不费力地处理安全连接。 可能是我的知识已经过时,但似乎libev不支持这一点。