¿Cuál es la diferencia entre libev y libevent?
(2)
Ambas 2 bibliotecas están diseñadas para la programación asíncrona de E / S, y ambas incorporan epoll en Linux, y kqueue en FreeBSD, etc.
Excepto diferencias superficiales, quiero decir, ¿cuál es la VERDADERA diferencia entre estas dos bibliotecas? con respecto a la arquitectura, o la filosofía de diseño?
En cuanto a la filosofía de diseño, libev fue creado para mejorar algunas decisiones arquitectónicas en libevent, por ejemplo, el uso variable global hizo que sea difícil usar libevent de forma segura en entornos multiproceso, las estructuras de observación son grandes porque combinan E / S, tiempo y señal manejadores en uno, los componentes adicionales como los servidores http y dns sufrieron de mala calidad de implementación y problemas de seguridad resultantes, y los temporizadores fueron inexactos y no soportaron bien los saltos de tiempo.
Libev intentó mejorar cada uno de estos, al no usar variables globales pero usando un contexto de bucle para todas las funciones, usando pequeños observadores para cada tipo de evento (un observador de E / S usa 56 bytes en x86_64 comparado con 136 para libevent), permitiendo extra tipos de eventos tales como temporizadores basados en reloj de pared frente a tiempo monotónico, interrupciones entre subprocesos, preparar y verificar vigilantes para incrustar otros bucles de eventos o para incrustarse, etc.
El problema del componente adicional se "resuelve" al no tenerlos en absoluto, por lo que libev puede ser pequeño y eficiente, pero también es necesario buscar en otra parte una biblioteca http, porque libev simplemente no tiene una (por ejemplo, hay una biblioteca muy relacionada llamada libeio que hace E / S asíncrona, que se puede usar de forma independiente o junto con libev, por lo que puede mezclar y combinar).
En resumen, libev intenta hacer una sola cosa (biblioteca de eventos POSIX), y esto de la manera más eficiente posible. Libevent intenta ofrecerle la solución completa (event lib, biblioteca de E / S sin bloqueo, servidor http, cliente DNS).
O, incluso más breve, libev intenta seguir la filosofía de la caja de herramientas de UNIX de hacer solo una cosa, lo mejor posible.
Tenga en cuenta que esta es la filosofía de diseño, que puedo afirmar con autoridad porque diseñé libev. Si usted ha llegado a estos objetivos de diseño, o si la filosofía se basa en principios sólidos, depende de usted juzgar.
Actualización 2017:
Me preguntaron varias veces a qué inexactitud del temporizador me refiero, y por qué libev no admite IOCP en Windows.
En cuanto a los temporizadores, libevent programa temporizadores relativos a un tiempo base desconocido que está en el futuro, sin que usted lo sepa. Libev puede decirle de antemano qué tiempo base utilizará para programar temporizadores, lo que permite a los programas usar tanto el enfoque libevent como el enfoque libev. Además, libevent a veces caduca los temporizadores temprano, dependiendo del back-end. El primero es un problema API, este último es reparable (y podría haber sido reparado desde - no lo verifiqué).
En cuanto al apoyo de la IOCP, no creo que se pueda hacer, ya que los IOCP simplemente no son lo suficientemente poderosos. Por un lado, necesitan un tipo de socket especial, lo que limitaría aún más el conjunto de identificadores permitidos en Windows (por ejemplo, los sockets utilizados por perl son del tipo "incorrecto" para IOCP). Además, los IOCP simplemente no admiten los eventos de preparación de E / S en absoluto, solo pueden hacer E / S reales. Hay soluciones para algunos tipos de manejadores, como hacer una lectura ficticia de 0 bytes, pero de nuevo, esto limitaría aún más los tipos de manejadores que puede usar en Windows y además dependería de un comportamiento no documentado que probablemente no sea compartido por todos los proveedores de conexión .
Que yo sepa, ninguna otra biblioteca de eventos admite IOCP en Windows, tampoco. Lo que libevent hace es, además de la biblioteca de eventos, que te permite poner en cola operaciones de lectura / escritura que luego se pueden hacer a través de IOCP. Como Libev no hace I / O por usted, no hay forma de usar IOCPs en la liberación misma.
Esto es de hecho por diseño: libev intenta ser pequeño y similar a POSIX, y Windows simplemente no tiene una forma eficiente de obtener eventos de E / S estilo POSIX. Si los IOCP son importantes, debe utilizarlos usted mismo o, de hecho, utilizar algunos de los muchos marcos que hacen E / S para usted y, por lo tanto, puede usar IOCP.
La gran ventaja de libevent para mí es el soporte integrado de OpenSSL. La interfaz Bufferevent, introducida en la versión 2.0 de libevent API, maneja las conexiones seguras casi sin ningún problema para el desarrollador. Puede ser que mi conocimiento se haya quedado desactualizado, pero parece que libev no lo admite.