stringtranslate.com

очередь

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 [6]

Прототипы и типы функций находятся в 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 для других платформ:

Рекомендации

  1. ^ abc Джонатан Лемон (2000). «kqueue, kevent — механизм уведомления о событиях ядра». Перекрестная ссылка BSD . FreeBSD , OpenBSD , NetBSD , DragonFly BSD .
    • «kqueue, kevent — механизм уведомления о событиях ядра». Страницы руководства FreeBSD.
    • «kqueue, kevent, EV_SET — механизм уведомления о событиях ядра». Сервер страниц руководства OpenBSD.
    • «kqueue, kevent — механизм уведомления о событиях ядра». Страницы онлайн-руководства DragonFly.
  2. ^ abc Джонатан Лемон (1 мая 2001 г.). Kqueue: универсальное и масштабируемое средство уведомления о событиях (PDF) . Материалы программы FREENIX: Ежегодная техническая конференция USENIX 2001 г. USENIX (опубликовано 25–30 июня 2001 г.).
    • «KQueue – универсальное и масштабируемое средство уведомления о событиях». Усеникс .
  3. ^ «Методы обработки соединения». nginx.org . _
  4. ^ Андрей Алексеев (2012). «§14. nginx». В Эми Браун; Грег Уилсон (ред.). Архитектура приложений с открытым исходным кодом, том II: структура, масштаб и еще несколько бесстрашных хаков. Лулу.com . ISBN 9781105571817.
  5. ^ libkqueue на GitHub
  6. ^ kqueue(2)  -  Руководство по системным вызовам FreeBSD

Внешние ссылки