Какая разница между libev и libevent?

Оба 2 libs предназначены для планирования async i/o, и оба задействуют epoll на linux, и kqueue на FreeBSD и т.д.

Кроме поверхностных различий, я имею в виду, что такое ИСТИННАЯ разница между этими двумя библиотеками? в отношении архитектуры или философии дизайна?

Ответ 1

Что касается философии дизайна, libev был создан для улучшения некоторых архитектурных решений в libevent, например, использование глобальных переменных затрудняло безопасное использование libevent в многопоточных средах, структуры наблюдателей большие, потому что они объединяют операции ввода-вывода, обработчиков времени и сигналов в одном, дополнительных компонентов, таких как серверы http и dns, которые пострадали от плохого качества реализации и возникающих проблем безопасности, а таймеры были неточными и не очень хорошо справлялись со скачками времени.

Libev попытался улучшить каждый из них, не используя глобальные переменные, но используя контекст цикла для всех функций, используя небольшие наблюдатели для каждого типа событий (наблюдатель I/O использует 56 байтов на x86_64 по сравнению с 136 для libevent), позволяя создавать дополнительные типы событий, такие как таймеры на основе wallclock и монотонного времени, прерывания между потоками, готовить и проверять наблюдателей для встраивания других циклов событий или для встраивания и т.д.

Проблема с дополнительными компонентами "решена", не имея их вообще, поэтому libev может быть небольшим и эффективным, но вам также нужно искать в другом месте для библиотеки http, потому что libev просто не имеет одного (например, существует очень связанная библиотека под названием libeio, которая выполняет асинхронный ввод-вывод, который может использоваться независимо или вместе с libev, поэтому вы можете смешивать и сопоставлять).

Итак, libev пытается сделать только одну вещь (библиотеку событий POSIX), и это наиболее эффективно. Libevent пытается дать вам полное решение (event lib, неблокирующая библиотека ввода-вывода, http-сервер, DNS-клиент).

Или, даже короче, libev пытается следовать философии инструментария UNIX, делая только одну вещь, насколько это возможно.

Обратите внимание, что это философия дизайна, которую я могу заявить с полномочиями, потому что я разработал libev. Независимо от того, были ли достигнуты эти цели дизайна или основывается ли философия на разумных принципах, вы должны судить.

Обновление 2017:

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

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

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

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

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

Ответ 2

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