Яка різниця між libev та libevent?


96

Обидві 2 бібліотеки призначені для асинхронного планування вводу-виводу, і обидві задіяні epoll у linux та kqueue у FreeBSD тощо

За винятком поверхневих відмінностей, я маю на увазі, яка ІСТИНА різниця між цими двома бібліотеками? щодо архітектури чи філософії дизайну?



1
libevent також підтримує IOCP для Windows (через bufferevent AFAIK), що libev не підтримує
rogerdpack

1
rogerdpack, підтримка libuv IOCP github.com/joyent/libuv
Денис Денисов

Відповіді:


223

Що стосується філософії дизайну, libev був створений для вдосконалення деяких архітектурних рішень у libevent, наприклад, глобальне використання змінних ускладнило безпечне використання libevent у багатопоточних середовищах, спостережливі структури великі, оскільки вони поєднують введення / вивід, час та сигнал обробників в одному, додаткові компоненти, такі як сервери http і dns, страждали від поганої якості реалізації та наслідків проблем із безпекою, а таймери були неточними і погано справлялися зі стрибками часу.

Libev намагався вдосконалити кожну з них, не використовуючи глобальних змінних, але використовуючи контур циклу для всіх функцій, використовуючи невеликі спостерігачі для кожного типу події (спостерігач вводу-виводу використовує 56 байт на x86_64 порівняно з 136 для libevent), що дозволяє додатково типи подій, такі як таймери, засновані на настінному годиннику та монотонному часі, переривання між потоками, підготовка та перевірка спостерігачів до вбудовування інших циклів подій або для вбудовування тощо.

Проблему додаткових компонентів "вирішують", не маючи їх взагалі, тому libev може бути невеликим та ефективним, але вам також потрібно шукати в іншому місці бібліотеку http, оскільки libev просто не має такої (наприклад, є дуже пов’язана бібліотека під назвою libeio, яка робить асинхронний введення / виведення, яку можна використовувати самостійно або разом з libev, так що ви можете змішувати та поєднувати)

Отже, коротко кажучи, libev намагається зробити лише одне (бібліотека подій POSIX), і це максимально ефективно. Libevent намагається надати вам повне рішення (lib подій, неблокуюча бібліотека вводу-виводу, сервер http, DNS-клієнт).

Або, ще коротше, libev намагається слідувати філософії набору інструментів UNIX, що робить лише одне, наскільки це можливо.

Зауважте, що це філософія дизайну, про яку я можу констатувати авторитет, тому що я створив libev. Чи справді ці цілі проекту були досягнуті, чи філософія ґрунтується на надійних принципах, вирішувати вам.

Оновлення 2017 року:

Мене неодноразово запитували, на яку неточність таймера я посилаюся, і чому libev не підтримує IOCP на вікнах.

Що стосується таймерів, то вільний графік планує таймери відносно деякого невідомого базового часу, який є в майбутньому, без того, щоб ви цього знали. Лібєв може заздалегідь повідомити вам, який базовий час він буде використовувати для планування таймерів, що дозволяє програмам використовувати як вільний підхід, так і підхід libev. Більше того, лівент іноді закінчує термін дії достроково, залежно від бекенда. Перше - це проблема API, останнє можна виправити (і, можливо, це було виправлено з - я не перевіряв).

Що стосується підтримки IOCP - я не думаю, що це можна зробити, оскільки IOCP просто недостатньо потужні. По-перше, їм потрібен спеціальний тип розеток, який би ще більше обмежив набір ручок, дозволених у Windows (наприклад, сокети, які використовуються perl, мають "неправильний" тип для IOCP. Крім того, IOCP просто взагалі не підтримують події готовності до введення-виведення, вони можуть виконувати лише фактичні введення-виведення. Існують способи вирішення деяких типів ручок, наприклад, манекен зчитування 0-байт, але, знову ж таки, це ще більше обмежить типи ручок, які ви можете використовувати у Windows, і, крім того, покладатиметься на незадокументовану поведінку, яку, ймовірно, не поділяють усі постачальники сокетів .

Наскільки мені відомо, жодна інша бібліотека подій також не підтримує IOCP на Windows. Що робить libevent, це, крім бібліотеки подій, це дозволяє вам чергувати операції читання / запису, які потім можна робити через IOCP. Оскільки libev не робить для вас введення-виведення, немає можливості використовувати IOCP у самому libev.

Це справді дизайн - libev намагається бути невеликим та схожим на POSIX, а у Windows просто немає ефективного способу отримання подій вводу / виводу у стилі POSIX. Якщо IOCP важливі, вам або доведеться використовувати їх самостійно, або дійсно використовувати деякі з багатьох інших фреймворків, які роблять для вас введення / виведення, і тому ви можете використовувати IOCP.


Марк, ти також автор libeio?
juanpavergara

на жаль, його видалили та замінили libuv: github.com/joyent/libuv/isissue/485 і це: groups.google.com/forum/#!topic/nodejs/UwHkaOksprw
Петро Тео

1
Я зробив гарне доповнення до libev, яке називається libevfibers, воно додає рівень волокна поверх libev, libcoro та libeio. Тут можна ознайомитись: github.com/Lupus/libevfibers
Лупус

1
libevє болючим на платформі Windows. Компілятор MinGW завжди ввімкнено ++activecnt(функцію ev_ref), і я не розумію, як вирішити цю проблему. Друга проблема полягає у використанні старого selectінтерфейсу сокета з нашою сучасною версією взаємодії сокета IOCP. Не могли б ви покращити підтримку Widnows?
Вітольд С.

1
Вибачте, що це потрібно сказати, але, схоже, за libev стоїть ще одна "філософія", яка зламала багато проектів з відкритим кодом. Очевидні дані, наприклад, у списках.schmorp.de / pipermail/ libev / 2017q1/ 002710.html або списки.schmorp.de/ pipermail / libev/ 2010q1 / 000912.html . Потенційні користувачі, мабуть, теж повинні це врахувати.
dbrank0

13

Великою перевагою libevent для мене є вбудована підтримка OpenSSL. Інтерфейс Bufferevent, представлений у версії 2.0 libevent API, майже безболісно обробляє захищені з'єднання для розробника. Можливо, мої знання застаріли, але схоже, що libev цього не підтримує.


3
Правильно: libev не робить введення / виведення для вас, а отже, не робить TLS для вас (або, фактично, будь-який ввід / вивід).
Згадай Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.