В чем разница между libev и libevent? - PullRequest
88 голосов
/ 24 февраля 2012

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

Кроме поверхностных различий, я имею в виду ВЕРНУЮ разницу между этими двумя библиотеками? относительно архитектуры или философии дизайна?

Ответы [ 2 ]

211 голосов
/ 22 декабря 2012

Что касается философии проектирования, 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 на окнах.

Что касается таймеров, libevent планирует таймеры относительно некоторого неизвестного базового времени, которое будет в будущем, без вашего ведома. Libev может заранее сообщить вам, какое базовое время он будет использовать для планирования таймеров, что позволяет программам использовать как подход libevent, так и подход libev. Кроме того, libevent иногда истекает таймеры рано, в зависимости от серверной части. Первая проблема связана с API, а вторая исправима (и, возможно, исправлена ​​с тех пор - я не проверял).

Что касается поддержки IOCP - я не думаю, что это возможно, поскольку IOCP просто недостаточно мощны. Во-первых, им нужен специальный тип сокета, который еще больше ограничил бы набор дескрипторов, разрешенных для окон (например, используемые в perl сокеты имеют «неправильный» тип для IOCP). Кроме того, IOCP просто не поддерживают события готовности ввода / вывода, они могут только выполнять фактический ввод / вывод. Существуют обходные пути для некоторых типов дескрипторов, например, для выполнения фиктивного 0-байтового чтения, но, опять же, это еще больше ограничит типы дескрипторов, которые можно использовать в окнах, и, кроме того, будет зависеть от недокументированного поведения, которое, вероятно, не используется всеми поставщиками сокетов .

Насколько мне известно, ни одна другая библиотека событий не поддерживает IOCP на окнах. Что делает libevent, так это, в дополнение к библиотеке событий, позволяет ставить в очередь операции чтения / записи, которые затем можно выполнять через IOCP. Так как libev не выполняет для вас ввод-вывод, невозможно использовать IOCP в самом libev.

Это действительно задумано - libev старается быть маленьким и подобным POSIX, а у окон просто нет эффективного способа получения событий ввода-вывода в стиле POSIX. Если IOCP важны, вы должны либо использовать их самостоятельно, либо использовать некоторые из многих других сред, которые выполняют ввод-вывод для вас и, следовательно, могут использовать IOCP.

13 голосов
/ 10 сентября 2013

Большим преимуществом libevent для меня является встроенная поддержка OpenSSL. Интерфейс Bufferevent, представленный в версии 2.0 API libevent , практически безболезненно обрабатывает безопасные соединения для разработчика. Может быть, мои знания устарели, но кажется, что libev не поддерживает это.

...