Ambas 2 bibliotecas están diseñadas para la programación de E / S asíncrona, y ambas utilizan epoll en linux y kqueue en FreeBSD, etc.
Excepto diferencias superficiales, quiero decir, ¿cuál es la VERDADERA diferencia entre estas dos bibliotecas? en cuanto a arquitectura, o filosofía del diseño?
Respuestas:
En cuanto a la filosofía de diseño, libev se creó para mejorar algunas de las decisiones arquitectónicas en libevent, por ejemplo, el uso de variables globales dificultaba el uso de libevent de forma segura en entornos multiproceso, las estructuras de observador son grandes porque combinan E / S, tiempo y señal controladores en uno, los componentes adicionales, como los servidores http y dns, sufrieron una mala calidad de implementación y problemas de seguridad resultantes, y los temporizadores eran inexactos y no se adaptaban bien a los saltos de tiempo.
Libev trató de mejorar cada uno de estos, no usando variables globales, sino usando un contexto de bucle para todas las funciones, usando observadores pequeños para cada tipo de evento (un observador de E / S usa 56 bytes en x86_64 en comparación con 136 para libevent), lo que permite más tipos de eventos como temporizadores basados en reloj de pared frente a tiempo monótono, interrupciones entre subprocesos, preparación y verificación de observadores para incrustar otros bucles de eventos o para ser incrustados, etc.
El problema de los componentes adicionales se "resuelve" al no tenerlos en absoluto, por lo que libev puede ser pequeño y eficiente, pero también debe 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 asincrónicas, que se puede usar de forma independiente o junto con libev, para que pueda 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 brindarle la solución completa (biblioteca de eventos, biblioteca de E / S sin bloqueo, servidor http, cliente DNS).
O, aún más breve, libev intenta seguir la filosofía de la caja de herramientas de UNIX de hacer una sola 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 estos objetivos de diseño se han alcanzado realmente, o si la filosofía se basa en principios sólidos, depende de usted para juzgar.
Actualización 2017:
Me preguntaron varias veces a qué inexactitud del temporizador me refiero y por qué libev no es compatible con IOCP en Windows.
En cuanto a los temporizadores, libevent programa los temporizadores en relación con 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 que los programas utilicen tanto el enfoque libevent como el enfoque libev. Además, libevent a veces expiraba los temporizadores antes, dependiendo del backend. El primero es un problema de la API, el segundo se puede solucionar (y podría haberse solucionado desde entonces, no lo comprobé).
En cuanto al soporte de IOCP, no creo que se pueda hacer, ya que los IOCP simplemente no son lo suficientemente poderosos. Por un lado, necesitan un tipo de conector especial, que limitaría aún más el conjunto de identificadores permitidos en Windows (por ejemplo, los conectores utilizados por perl son del tipo "incorrecto" para los IOCP). Además, los IOCP simplemente no admiten eventos de preparación de E / S en absoluto, solo pueden realizar E / S reales. Hay soluciones para algunos tipos de identificadores, como hacer una lectura ficticia de 0 bytes, pero nuevamente, esto limitaría aún más los tipos de identificadores que puede usar en Windows y, además, dependería de un comportamiento indocumentado que probablemente no sea compartido por todos los proveedores de sockets. .
Que yo sepa, ninguna otra biblioteca de eventos admite IOCP en Windows. Lo que libevent hace es, además de la biblioteca de eventos, que le permite poner en cola operaciones de lectura / escritura que luego se pueden realizar a través de IOCP. Dado que libev no realiza E / S por usted, no hay forma de utilizar IOCP en libev.
De hecho, esto es 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 de estilo POSIX. Si los IOCP son importantes, debe usarlos usted mismo o, de hecho, usar algunos de los muchos otros marcos que realizan E / S por usted y, por lo tanto, pueden usar IOCP.
fuente
libev
es doloroso en la plataforma Windows. El compilador MinGW siempre está activado++activecnt
(funciónev_ref
) y no entiendo cómo resolver este problema. El segundo problema es el uso deselect
una interfaz de socket antigua con nuestra versión IOCP moderna de interoperación de socket. ¿Podrías mejorar el soporte de Widnows?La gran ventaja de libevent para mí es la compatibilidad con OpenSSL incorporada. La interfaz Bufferevent, introducida en la versión 2.0 de libevent API, maneja las conexiones seguras casi sin problemas para el desarrollador. Puede que mi conocimiento se haya quedado obsoleto, pero parece que libev no admite esto.
fuente