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?
Jawaban:
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.
sumber
libev
menyakitkan di platform Windows. Kompiler MinGW selalu sigfault++activecnt
(fungsiev_ref
) dan saya tidak mengerti bagaimana menyelesaikan masalah ini. Masalah kedua adalah menggunakanselect
antarmuka soket lama dengan versi interoperasional soket IOCP modern kami. Bisakah Anda meningkatkan dukungan Widnows?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.
sumber