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]
Прототипы и типы функций находятся в sys/event.h
.
ИНТ kqueue ( недействительный );
Создает новую очередь событий ядра и возвращает дескриптор.
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 для других платформ:
kqueue
могут уведомлять, когда дескриптор файла готов выполнить операцию ввода-вывода.