Libev ve libevent arasındaki fark nedir?


96

Her iki 2 kitaplık da eşzamansız G / Ç planlaması için tasarlanmıştır ve her ikisi de linux üzerinde epoll ve FreeBSD üzerinde kqueue vb.

Yüzeysel farklılıklar dışında, demek istediğim bu iki kütüphane arasındaki DOĞRU fark nedir? mimariye mi yoksa tasarım felsefesine mi?



1
libevent, libev'in desteklemediği pencereler için IOCP'yi de destekler (bufferevent AFAIK aracılığıyla)
rogerdpack

1
rogerdpack, libuv desteği IOCP github.com/joyent/libuv
Denis Denisov

Yanıtlar:


223

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.


Marc, libeio'nun da yazarı mısın?
juanpavergara


1
Libev'e libevfibers adında güzel bir ekleme yaptım, libev, libcoro ve libeio'nun üstüne bir fiber seviyesi ekliyor. Burada bulunabilir: github.com/Lupus/libevfibers
Lupus

1
libevWindows platformunda ağrılıdır. MinGW derleyicisi her zaman sigfault ++activecnt(işlev ev_ref) üzerinde ve bu sorunu nasıl çözeceğimi anlamıyorum. İkinci sorun, selectsoket birlikte çalışmasının modern IOCP sürümüyle eski soket arabirimini kullanmaktır . Widnows desteğini iyileştirebilir misiniz?
Vitold S.

3
Üzgünüm ama libev'in arkasında birçok açık kaynak projesini kıran başka bir "felsefe" var gibi görünüyor. Örneğin lists.schmorp.de/pipermail/libev/2017q1/002710.html veya lists.schmorp.de/pipermail/libev/2010q1/000912.html'de görülebilir . Potansiyel kullanıcılar muhtemelen bunu da düşünmelidir.
dbrank0

13

Benim için libevent'in en büyük avantajı yerleşik OpenSSL desteğidir. 2.0 sürümünde tanıtılan Bufferevent arayüzü, Libevent API, geliştirici için neredeyse acısız güvenli bağlantıları yönetir. Bilgim eskimiş olabilir ama libev bunu desteklemiyor gibi görünüyor .


3
Doğru: libev sizin için G / Ç yapmaz ve bu nedenle sizin için TLS (veya aslında herhangi bir G / Ç) yapmaz.
Monica'yı hatırla
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.