Domanda

Entrambi i 2 libri sono progettati per la pianificazione I/O asincrima, ed entrambi coinvolgono Epoll su Linux e Kqueue su FreeBSD, ecc.

Tranne differenze superficiali, intendo qual è la vera differenza tra queste due biblioteche? Per quanto riguarda l'architettura o la filosofia del design?

È stato utile?

Soluzione

Per quanto riguarda la filosofia del design, Libev è stato creato per migliorare alcune delle decisioni architettoniche di LiBevent, ad esempio, l'utilizzo delle variabili globali ha reso difficile l'uso di Libevent in modo sicuro in ambienti multithread, le strutture di guardia sono grandi perché combinano I/O, Time and Signal I gestori in uno, i componenti extra come i server HTTP e DNS hanno sofferto di cattiva qualità di implementazione e problemi di sicurezza risultanti, e i timer erano inesatti e non hanno affrontato bene i salti del tempo.

LiBev ha cercato di migliorare ciascuno di questi, non usando variabili globali ma usando un contesto ad anello per tutte le funzioni, usando piccoli osservatori per ciascun 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 in base a Wallclock vs. Monotonic Time, interruzioni inter-thread, preparare e controllare gli osservatori per incorporare altri loop di eventi o essere incorporati e così via.

Il problema del componente extra è "risolto" non averli 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'è un Biblioteca molto correlata chiamata Libeio che fa I/O asincrona, che può essere utilizzata in modo indipendente o insieme a Libev, in modo da poter mescolare e abbinare).

Quindi, in breve, Libev cerca di fare solo una cosa (Biblioteca di eventi Posix), e questo nel modo più efficiente possibile. LiBevent cerca di darti la soluzione completa (evento Lib, libreria I/O non bloccante, server HTTP, client DNS).

Oppure, anche più breve, Libev cerca di seguire la filosofia di Toolbox Unix di fare una sola cosa, il più buona possibile.

Si noti che questa è la filosofia del design, che posso indicare con autorità perché ho progettato libev. Se sono stati effettivamente raggiunti questi obiettivi di progettazione, o se la filosofia si basa su solidi principi, dipende da te.

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 rispetto ad un tempo di base sconosciuto che è in futuro, senza che tu lo sappia. LiBev può dirti in anticipo quale tempo di base utilizzerà per pianificare i timer, il che consente ai programmi di utilizzare sia l'approccio LiBevent che l'approccio LiBev. Inoltre, Libevent a volte scadeva i timer presto, a seconda del backend. Il primo è un problema API, il secondo è fissabile (e potrebbe essere stato risolto da allora - non ho controllato).

Per quanto riguarda il supporto IOCP - non credo che possa essere fatto, poiché IOCP semplicemente non è abbastanza potente. Per prima cosa, hanno bisogno di un tipo di socket speciale, che limiterebbe ancora di più il set di maniglie consentite su Windows (ad esempio, i SOPCKET utilizzati da Perl sono del tipo "sbagliato" per IOCP). Inoltre, i IOCP semplicemente non supportano affatto gli eventi di prontezza I/O, possono solo fare I/O reali. Ci sono soluzioni alternative per alcuni tipi di manico, come fare una lettura fittizia 0 byte, ma ancora una volta, ciò limiterebbe i tipi di manico che puoi usare su Windows ancora di più e inoltre si baserebbe su comportamenti non documentati che probabilmente non sono condivisi da tutti i fornitori di socket .

Per quanto ne sappia, nessun'altra libreria di eventi supporta i IOCP su Windows. Ciò che Libevent fa è, oltre alla libreria di eventi, che ti consente di mettere in coda le operazioni di lettura/scrittura che possono quindi essere eseguite tramite IOCP. Dal momento che LiBev non fa I/O per te, non c'è modo di usare IOCP nella stessa Libev.

Questo è davvero in base al design: Libev cerca di essere piccolo e simile a un posix, e Windows semplicemente non ha un modo efficiente per ottenere eventi I/O in stile POSIX. Se i IOCP sono importanti, devi usarli da solo o usare alcuni dei tanti altri framework che fanno I/O per te e quindi possono usare IOCP.

Altri suggerimenti

Il grande vantaggio di libevent Per me è il supporto OpenSSL integrato. Interfaccia bufferevent, introdotta nella versione 2.0 di libevent API, gestisce le connessioni sicure quasi indolore per lo sviluppatore. Potrebbe essere la mia conoscenza è andata fuori appuntamento ma sembra Libev non lo supporta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top