очередь
Kqueue — это масштабируемый интерфейс уведомлений о событиях, представленный во FreeBSD 4.1 в июле 2000 года. [1] [2] также поддерживается в NetBSD , OpenBSD , DragonFly BSD и macOS . Kqueue был первоначально написан в 2000 году Джонатаном Лемоном. [1] [2] затем участвовал в основной команде FreeBSD . Kqueue позволяет такому программному обеспечению, как nginx, решить проблему c10k . [3] [4] Термин «kqueue» относится к его функции как «очереди событий ядра». [1] [2]
Kqueue обеспечивает эффективные конвейеры событий ввода и вывода между ядром и пользовательской средой . Таким образом, можно изменять фильтры событий, а также получать ожидающие события, используя только один системный вызов для kevent(2)
за каждую итерацию основного цикла событий . Это контрастирует со старыми традиционными вызовами системы опроса, такими как poll(2)
и select(2)
которые менее эффективны, особенно при опросе событий в многочисленных файловых дескрипторах.
Kqueue не только обрабатывает события файлового дескриптора , но также используется для различных других уведомлений, таких как мониторинг модификации файлов , сигналы , события асинхронного ввода-вывода (AIO), мониторинг изменения состояния дочернего процесса и таймеры , которые поддерживают наносекундное разрешение. использовать определяемые пользователем события в дополнение к событиям, предоставляемым ядром.
Некоторые другие операционные системы , которые традиционно поддерживали только select(2)
и poll(2)
в настоящее время также предоставляют более эффективные альтернативы опросу, такие как epoll в Linux и порты завершения ввода-вывода в Windows и Solaris .
libkqueue
представляет собой пользовательского пространства реализацию kqueue(2)
, который преобразует вызовы в собственный механизм обработки событий операционной системы. [5]
API
[ редактировать ]![]() | Этот раздел в значительной степени или полностью опирается на один источник . ( Апрель 2024 г. ) |
Прототипы и типы функций можно найти в sys/event.h
. [6]
int kqueue(void);
Создает новую очередь событий ядра и возвращает дескриптор.
int kevent(int kq, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout);
Используется для регистрации событий в очереди, затем ожидания и возврата пользователю любых ожидающих событий. В отличие от epoll , kqueue использует одну и ту же функцию для регистрации и ожидания событий, а несколько источников событий могут быть зарегистрированы и изменены с помощью одного вызова. changelist
Массив можно использовать для передачи изменений (изменение типа ожидаемых событий, регистрация новых источников событий и т. д.) в очередь событий, которые применяются до начала ожидания событий. nevents
размер, предоставленный пользователем eventlist
массив, который используется для получения событий из очереди событий.
EV_SET(kev, ident, filter, flags, fflags, data, udata);
Макрос, который используется для удобной инициализации struct kevent
объект.
См. также
[ редактировать ]Независимые от ОС библиотеки с поддержкой kqueue:
Эквивалент Kqueue для других платформ:
- в Solaris, Windows и AIX: порты завершения ввода-вывода . Обратите внимание, что порты завершения уведомляют о завершении запрошенной операции, тогда как
kqueue
также может уведомлять, когда файловый дескриптор готов выполнить операцию ввода-вывода. - в Linux:
- Системный вызов epoll имеет схожую, но не идентичную семантику.
- inotify — это подсистема ядра Linux, которая замечает изменения в файловой системе и сообщает об этом приложениям.
Ссылки
[ редактировать ]- ^ Jump up to: а б с Джонатан Лемон (2000). «kqueue, kevent — механизм уведомления о событиях ядра» . Перекрестная ссылка BSD . FreeBSD , OpenBSD , NetBSD , DragonFly BSD .
- «kqueue, kevent — механизм уведомления о событиях ядра». Страницы руководства FreeBSD .
- «kqueue, kevent, EV_SET — механизм уведомления о событиях ядра». Сервер страниц руководства OpenBSD .
- «kqueue, kevent — механизм уведомления о событиях ядра». Страницы онлайн-руководства DragonFly .
- ^ Jump up to: а б с Джонатан Лемон (1 мая 2001 г.). Kqueue: универсальное и масштабируемое средство уведомления о событиях (PDF) . Материалы программы FREENIX Track: Ежегодная техническая конференция USENIX 2001 г. USENIX (опубликовано 25–30 июня 2001 г.).
- ^ «Методы обработки соединений» . nginx.org .
- ^ Андрей Алексеев (2012). «§14. nginx» . В Эми Браун; Грег Уилсон (ред.). Архитектура приложений с открытым исходным кодом, том II: структура, масштаб и еще несколько бесстрашных хаков . Лулу.com . ISBN 9781105571817 .
- ^ libkqueue на GitHub
- ^ FreeBSD по системным вызовам Руководство –
Внешние ссылки
[ редактировать ]- FreeBSD по системным вызовам Руководство –
- libbrb_core реализует абстракцию для событийно-ориентированной базы, используя
kqueue()
системный вызов - Исходный код FreeBSD
kqueue()
системный вызов - Исходный код OpenBSD
kqueue()
системный вызов - Исходный код NetBSD
kqueue()
системный вызов - Исходный код DragonFly BSD
kqueue()
системный вызов