Qual è la differenza tra libev e libevent?


96

Entrambe le librerie 2 sono progettate per la pianificazione i / o asincrona, ed entrambe si impegnano con epoll su Linux e kqueue su FreeBSD, ecc.

Salvo differenze superficiali, voglio dire qual è la VERA differenza tra queste due librerie? riguardo all'architettura o alla filosofia del design?



1
libevent supporta anche IOCP per Windows (tramite bufferevent AFAIK) che libev no
rogerdpack

1
rogerdpack, supporto libuv IOCP github.com/joyent/libuv
Denis Denisov

Risposte:


223

Per quanto riguarda la filosofia di progettazione, libev è stato creato per migliorare alcune delle decisioni architetturali in libevent, ad esempio, l'utilizzo di variabili globali ha reso difficile usare libevent in modo sicuro in ambienti multithread, le strutture watcher sono grandi perché combinano I / O, tempo e segnale gestori in uno, i componenti extra come i server http e dns hanno sofferto di cattiva qualità di implementazione e conseguenti problemi di sicurezza, ei timer erano inesatti e non hanno affrontato bene i salti temporali.

Libev ha cercato di migliorare ciascuno di questi, non utilizzando variabili globali ma utilizzando un contesto di loop per tutte le funzioni, utilizzando piccoli watcher per ogni tipo di evento (un watcher I / O utilizza 56 byte su x86_64 rispetto a 136 per libevent), consentendo extra tipi di eventi come timer basati su wallclock rispetto a tempo monotono, interruzioni tra thread, preparare e controllare watcher per incorporare altri loop di eventi o per essere incorporati e così via.

Il problema dei componenti aggiuntivi è "risolto" non possedendoli affatto, quindi libev può essere piccolo ed efficiente, ma devi anche cercare altrove una libreria http, perché libev semplicemente non ne ha una (ad esempio, c'è una libreria molto correlata chiamata libeio che esegue I / O asincrono, che può essere utilizzata indipendentemente o insieme a libev, in modo da poter combinare e abbinare).

Quindi, in breve, libev cerca di fare solo una cosa (libreria di eventi POSIX), e questo nel modo più efficiente possibile. Libevent cerca di darti la soluzione completa (libreria degli eventi, libreria I / O non bloccante, server http, client DNS).

O, ancora più breve, libev cerca di seguire la filosofia del toolbox UNIX di fare solo una cosa, il più bene possibile.

Nota che questa è la filosofia di progettazione, che posso affermare con autorità perché ho progettato libev. Sta a te giudicare se questi obiettivi di progettazione sono stati effettivamente raggiunti o se la filosofia si basa su solidi principi.

Aggiornamento 2017:

Mi è stato chiesto più volte a quale inesattezza del timer mi riferisco e perché libev non supporta IOCP su Windows.

Per quanto riguarda i timer, libevent pianifica i timer relativi a un tempo di base sconosciuto che è nel futuro, senza che tu lo sappia. Libev può dirti in anticipo quale tempo di base utilizzerà per programmare i timer, il che consente ai programmi di utilizzare sia l'approccio libevent che l'approccio libev. Inoltre, libevent a volte fa scadere i timer in anticipo, a seconda del backend. Il primo è un problema API, il secondo è risolvibile (e potrebbe essere stato risolto da allora - non ho controllato).

Per quanto riguarda il supporto IOCP, non penso che possa essere fatto, poiché gli IOCP semplicemente non sono abbastanza potenti. Per prima cosa, hanno bisogno di un tipo di socket speciale, che limiterebbe ancora di più il set di handle consentito su Windows (ad esempio, i sopcket usati da perl sono del tipo "sbagliato" per IOCP). Inoltre, gli IOCP semplicemente non supportano affatto gli eventi di predisposizione I / O, possono solo eseguire l'I / O effettivo. Ci sono soluzioni alternative per alcuni tipi di handle, come eseguire una lettura fittizia di 0 byte, ma ancora una volta, questo limiterebbe ancora di più i tipi di handle che puoi usare su Windows e inoltre si baserebbe su un comportamento non documentato che probabilmente non è condiviso da tutti i provider di socket .

Per quanto ne so, nessun'altra libreria di eventi supporta IOCP su Windows. Ciò che fa libevent è che, oltre alla libreria degli eventi, ti consente di mettere in coda le operazioni di lettura / scrittura che possono essere eseguite tramite IOCP. Poiché libev non esegue l'I / O per te, non c'è modo di usare gli IOCP in libev stesso.

Questo è effettivamente di progettazione: libev cerca di essere piccolo e simile a POSIX, e Windows semplicemente non ha un modo efficiente per ottenere eventi I / O in stile POSIX. Se gli IOCP sono importanti, devi usarli tu stesso, o addirittura usare alcuni dei molti altri framework che fanno I / O per te e quindi puoi usare IOCP.


Marc sei anche l'autore di libeio?
juanpavergara

purtroppo, è stato rimosso e sostituito da libuv: github.com/joyent/libuv/issues/485 e questo: groups.google.com/forum/#!topic/nodejs/UwHkaOksprw
Peter Teoh

1
Ho fatto una bella aggiunta a libev chiamata libevfibers, aggiunge un livello di fibra oltre a libev, libcoro e libeio. Può essere trovato qui: github.com/Lupus/libevfibers
Lupus

1
libevè doloroso sulla piattaforma Windows. Il compilatore MinGW sigfault sempre su ++activecnt(funzione ev_ref) e non capisco come risolvere questo problema. Il secondo problema è l'utilizzo della vecchia selectinterfaccia socket con la nostra moderna versione IOCP dell'interoperabilità socket. Potresti migliorare il supporto di Widnows?
Vitold S.

1
Mi dispiace doverlo dire, ma sembra esserci un'altra "filosofia" dietro libev, che ha rotto molti progetti open source. Evidente ad esempio in lists.schmorp.de/pipermail/libev/2017q1/002710.html o lists.schmorp.de/pipermail/libev/2010q1/000912.html . I potenziali utenti dovrebbero probabilmente considerare anche questo.
dbrank0

13

Il grande vantaggio di libevent per me è il supporto OpenSSL integrato. L'interfaccia Bufferevent, introdotta nella versione 2.0 dell'API libevent , gestisce le connessioni sicure in modo quasi indolore per lo sviluppatore. Può essere che la mia conoscenza sia obsoleta ma sembra che libev non lo supporti.


3
Corretto: libev non fa I / O per te, e quindi non fa TLS per te (o, in effetti, alcun I / O).
Ricorda Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.