В чем разница между libev и libevent?



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



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

416   2  

2 ответов:

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

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

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

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

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

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

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

меня несколько раз спрашивали, на какую неточность таймера я ссылаюсь, и почему libev не поддерживает IOCPs в windows.

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

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

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

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

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

Comments

    Ничего не найдено.