Apa perbedaan antara libev dan libevent?

96

Kedua 2 lib tersebut dirancang untuk penjadwalan i / o asinkron, dan keduanya menggunakan epoll di linux, dan kqueue di FreeBSD, dll.

Kecuali perbedaan dangkal, maksud saya apa perbedaan BENAR antara kedua perpustakaan ini? tentang arsitektur, atau filosofi desain?

ciphor
sumber
1
libevent juga mendukung IOCP untuk windows (melalui bufferevent AFAIK) yang tidak
dimiliki libev
1
rogerdpack, dukungan libuv IOCP github.com/joyent/libuv
Denis Denisov

Jawaban:

223

Adapun filosofi desain, libev dibuat untuk memperbaiki beberapa keputusan arsitektur di libevent, misalnya, penggunaan variabel global menyulitkan penggunaan libevent dengan aman di lingkungan multithread, struktur pengamat besar karena menggabungkan I / O, waktu dan sinyal penangan dalam satu, komponen tambahan seperti server http dan dns mengalami kualitas implementasi yang buruk dan masalah keamanan yang diakibatkannya, dan pengatur waktu tidak tepat dan tidak mengatasi lompatan waktu dengan baik.

Libev mencoba meningkatkan masing-masing ini, dengan tidak menggunakan variabel global tetapi menggunakan konteks loop untuk semua fungsi, dengan menggunakan pengamat kecil untuk setiap jenis acara (pengamat I / O menggunakan 56 byte pada x86_64 dibandingkan dengan 136 untuk libevent), memungkinkan ekstra jenis acara seperti pengatur waktu berdasarkan jam dinding vs. waktu monoton, interupsi inter-thread, persiapkan dan periksa pengamat untuk menyematkan loop acara lain atau untuk disematkan, dan sebagainya.

Masalah komponen tambahan "diselesaikan" dengan tidak memilikinya sama sekali, jadi libev bisa kecil dan efisien, tetapi Anda juga perlu mencari di tempat lain untuk perpustakaan http, karena libev tidak memilikinya (misalnya, ada pustaka yang sangat terkait yang disebut libeio yang melakukan I / O asinkron, yang dapat digunakan secara independen atau bersama-sama dengan libev, sehingga Anda dapat mencampur dan mencocokkan).

Jadi singkatnya, libev mencoba melakukan satu hal saja (POSIX event library), dan ini dengan cara yang seefisien mungkin. Libevent mencoba memberi Anda solusi lengkap (event lib, pustaka I / O non-pemblokiran, server http, klien DNS).

Atau, lebih pendek lagi, libev mencoba mengikuti filosofi kotak alat UNIX untuk melakukan satu hal saja, sebaik mungkin.

Perhatikan bahwa ini adalah filosofi desain, yang dapat saya nyatakan dengan otoritas karena saya mendesain libev. Apakah tujuan desain ini benar-benar telah tercapai, atau apakah filosofi tersebut didasarkan pada prinsip yang kuat, terserah Anda untuk menilai.

Perbarui 2017:

Saya ditanyai beberapa kali tentang ketidaktepatan pengatur waktu yang saya maksud, dan mengapa libev tidak mendukung IOCP di windows.

Sedangkan untuk pengatur waktu, libevent menjadwalkan pengatur waktu relatif terhadap beberapa waktu dasar yang tidak diketahui di masa mendatang, tanpa Anda sadari. Libev dapat memberi tahu Anda sebelumnya waktu dasar yang akan digunakan untuk menjadwalkan pengatur waktu, yang memungkinkan program menggunakan pendekatan libevent dan pendekatan libev. Selain itu, libevent terkadang akan menghentikan pengatur waktu lebih awal, tergantung pada backend. Yang pertama adalah masalah API, yang terakhir dapat diperbaiki (dan mungkin telah diperbaiki sejak - saya tidak memeriksanya).

Adapun dukungan IOCP - saya rasa itu tidak bisa dilakukan, karena IOCP tidak cukup kuat. Untuk satu hal, mereka memerlukan tipe soket khusus, yang akan lebih membatasi set pegangan yang diizinkan pada windows (misalnya, sopcket yang digunakan oleh perl memiliki tipe yang "salah" untuk IOCP). Selain itu, IOCP sama sekali tidak mendukung peristiwa kesiapan I / O, mereka hanya dapat melakukan I / O aktual. Ada beberapa solusi untuk beberapa jenis pegangan, seperti melakukan pembacaan dummy 0-byte, tetapi sekali lagi, ini akan membatasi jenis pegangan yang dapat Anda gunakan di windows bahkan lebih dan selanjutnya akan bergantung pada perilaku tidak berdokumen yang kemungkinan tidak dibagikan oleh semua penyedia soket .

Sepengetahuan saya, tidak ada pustaka acara lain yang mendukung IOCP di windows. Apa yang dilakukan libevent adalah, selain pustaka acara, ia memungkinkan Anda untuk mengantri operasi baca / tulis yang kemudian dapat dilakukan melalui IOCP. Karena libev tidak melakukan I / O untuk Anda, tidak ada cara untuk menggunakan IOCP di libev itu sendiri.

Ini memang dirancang - libev mencoba menjadi kecil dan seperti POSIX, dan windows tidak memiliki cara yang efisien untuk mendapatkan acara I / O gaya POSIX. Jika IOCP penting, Anda harus menggunakannya sendiri, atau memang menggunakan beberapa dari banyak kerangka kerja lain yang melakukan I / O untuk Anda dan oleh karena itu dapat menggunakan IOCP.

Ingat Monica
sumber
Marc, apakah Anda juga penulis libeio?
juanpavergara
sayangnya, itu telah dihapus dan diganti dengan libuv: github.com/joyent/libuv/issues/485 dan ini: groups.google.com/forum/#!topic/nodejs/UwHkaOksprw
Peter Teoh
1
Saya telah membuat tambahan yang bagus untuk libev yang disebut libevfibers, ini menambahkan level serat di atas libev, libcoro dan libeio. Dapat ditemukan di sini: github.com/Lupus/libevfibers
Lupus
1
libevmenyakitkan di platform Windows. Kompiler MinGW selalu sigfault ++activecnt(fungsi ev_ref) dan saya tidak mengerti bagaimana menyelesaikan masalah ini. Masalah kedua adalah menggunakan selectantarmuka soket lama dengan versi interoperasional soket IOCP modern kami. Bisakah Anda meningkatkan dukungan Widnows?
Vitold S.
1
Mohon maaf untuk mengatakannya, tetapi tampaknya ada "filosofi" lain di balik libev, yang telah merusak banyak proyek open source. Terbukti misalnya di lists.schmorp.de/pipermail/libev/2017q1/002710.html atau lists.schmorp.de/pipermail/libev/2010q1/000912.html . Pengguna potensial mungkin harus mempertimbangkan ini juga.
dbrank0
13

Keuntungan terbesar dari libevent bagi saya adalah dukungan OpenSSL bawaan . Antarmuka Bufferevent, yang diperkenalkan dalam versi 2.0 dari libevent API, menangani koneksi aman hampir tanpa kesulitan bagi pengembang. Mungkin pengetahuan saya sudah kedaluwarsa tetapi tampaknya libev tidak mendukung ini.

Vitaly Isaev
sumber
3
Benar: libev tidak melakukan I / O untuk Anda, dan oleh karena itu tidak melakukan TLS untuk Anda (atau, pada kenyataannya, I / O apa pun).
Ingat Monica