Tasarım felsefesine gelince, libev, libevent'teki bazı mimari kararları geliştirmek için oluşturuldu, örneğin, global değişken kullanımı libevent'i çok iş parçacıklı ortamlarda güvenli bir şekilde kullanmayı zorlaştırdı, izleyici yapıları büyüktür çünkü G / Ç, zaman ve sinyali birleştirirler. http ve dns sunucuları gibi ekstra bileşenler kötü uygulama kalitesinden ve sonuçta ortaya çıkan güvenlik sorunlarından muzdaripti ve zamanlayıcılar hatalıydı ve zaman sıçramalarıyla iyi başa çıkamadı.
Libev, küresel değişkenler kullanmayarak, ancak tüm işlevler için bir döngü bağlamı kullanarak, her olay türü için küçük izleyiciler kullanarak (bir G / Ç izleyicisi, libevent için 136'ya kıyasla x86_64'te 56 bayt kullanır) ve ekstra Duvar saati ve monoton zamana dayalı zamanlayıcılar gibi olay türleri, iş parçacığı arası kesintiler, diğer olay döngülerini yerleştirmek veya gömülmek için izleyicileri hazırlayın ve kontrol edin.
Ekstra bileşen problemi, onlara hiç sahip olmamakla "çözülür", bu nedenle libev küçük ve verimli olabilir, ancak ayrıca bir http kitaplığı için başka bir yere bakmanız gerekir, çünkü libev'in bir tane yoktur (örneğin, bir libeio adlı, bağımsız olarak veya libev ile birlikte kullanılabilen, eşzamanlı olmayan G / Ç yapan çok ilgili kitaplık, böylece karıştırıp eşleştirebilirsiniz).
Kısacası, libev yalnızca bir şeyi (POSIX olay kitaplığı) yapmaya çalışır ve bunu mümkün olan en verimli şekilde yapar. Libevent size tam çözümü sunmaya çalışır (olay kitaplığı, engellemesiz G / Ç kitaplığı, http sunucusu, DNS istemcisi).
Ya da, daha da kısası, libev, UNIX araç kutusu felsefesini, yalnızca bir şeyi mümkün olduğunca iyi yapma felsefesini izlemeye çalışır.
Bunun, otorite ile ifade edebileceğim tasarım felsefesi olduğuna dikkat edin, çünkü libev'i ben tasarladım. Bu tasarım hedeflerine gerçekten ulaşılıp ulaşılmadığı veya felsefenin sağlam ilkelere dayanıp dayanmadığı, karar vermek size kalmış.
2017 Güncellemesi:
Bana defalarca hangi zamanlayıcının hatasız olduğundan bahsettiğim ve libev'in Windows'ta IOCP'leri neden desteklemediği soruldu.
Zamanlayıcılara gelince, libevent zamanlayıcıları siz bilmeden gelecekte bilinmeyen bazı temel zamana göre planlar. Libev, programların hem libevent yaklaşımını hem de libev yaklaşımını kullanmasına izin veren zamanlayıcıları planlamak için hangi temel zamanı kullanacağını önceden size söyleyebilir. Dahası, libevent bazen arka uca bağlı olarak zamanlayıcıları erken sona erdirebilir. İlki bir API sorunu, ikincisi düzeltilebilir (ve o zamandan beri düzeltilmiş olabilir - kontrol etmedim).
IOCP desteğine gelince - IOCP'ler yeterince güçlü olmadığı için yapılabileceğini sanmıyorum. Öncelikle, pencerelerde izin verilen tanıtıcı kümesini daha da sınırlandıracak özel bir soket türüne ihtiyaçları vardır (örneğin, perl tarafından kullanılan yuvalar IOCP'ler için "yanlış" türdedir). Dahası, IOCP'ler G / Ç hazır olma olaylarını hiçbir şekilde desteklemez, yalnızca gerçek G / Ç gerçekleştirebilirler. Sahte 0 bayt okuma yapmak gibi bazı tutamaç türleri için geçici çözümler vardır, ancak yine bu, pencerelerde kullanabileceğiniz tutamaç türlerini daha da sınırlandırır ve ayrıca tüm soket sağlayıcıları tarafından paylaşılmayan belgelenmemiş davranışa dayanır. .
Bildiğim kadarıyla, başka hiçbir olay kütüphanesi de pencerelerde IOCP'leri desteklemiyor. Libevent'in yaptığı şey, olay kitaplığına ek olarak, okuma / yazma işlemlerini sıraya koymanıza ve daha sonra IOCP'ler aracılığıyla yapılmasına izin vermesidir. Libev sizin için G / Ç yapmadığından, IOCP'leri libev'in kendisinde kullanmanın bir yolu yoktur.
Bu gerçekten tasarım gereğidir - libev küçük ve POSIX benzeri olmaya çalışır ve pencerelerin POSIX tarzı G / Ç olaylarını almanın etkili bir yolu yoktur. IOCP'ler önemliyse, onları ya kendiniz kullanmanız ya da aslında sizin için G / Ç yapan ve dolayısıyla IOCP'leri kullanabilen diğer birçok çerçeveyi kullanmanız gerekir.