Kqueue es una interfaz de notificación de eventos escalable introducida en FreeBSD 4.1 en julio de 2000, [1] [2] también compatible con NetBSD , OpenBSD , DragonFly BSD y macOS . Kqueue fue creado originalmente en 2000 por Jonathan Lemon, [1] [2] que en ese entonces formaba parte del equipo central de FreeBSD . Kqueue hace posible que software como nginx resuelva el problema c10k . [3] [4] El término "kqueue" se refiere a su función como una "cola de eventos del núcleo" [1] [2]
Kqueue proporciona canales de entrada y salida de eventos eficientes entre el núcleo y el espacio de usuario . Por lo tanto, es posible modificar los filtros de eventos, así como recibir eventos pendientes, mientras se utiliza una única llamada al sistema por kevent(2)cada iteración del bucle de eventos principal . Esto contrasta con las llamadas al sistema de sondeo tradicionales más antiguas , como poll(2)y , select(2)que son menos eficientes, especialmente cuando se sondean eventos en numerosos descriptores de archivos.
Kqueue no solo maneja eventos de descriptores de archivos , sino que también se utiliza para varias otras notificaciones, como monitoreo de modificaciones de archivos , señales , eventos de E/S asincrónicas (AIO), monitoreo de cambios de estado de procesos secundarios y temporizadores que admiten una resolución de nanosegundos ; además, kqueue proporciona una forma de usar eventos definidos por el usuario además de los proporcionados por el kernel.
Algunos otros sistemas operativos que tradicionalmente solo admitían select(2)y poll(2)actualmente también brindan alternativas de sondeo más eficientes, como epoll en Linux y puertos de finalización de E/S en Windows y Solaris .
libkqueuees una implementación de espacio de usuariokqueue(2) de , que traduce llamadas al mecanismo de eventos nativo del backend de un sistema operativo. [5]
API
Los prototipos y tipos de funciones se encuentran en sys/event.h. [6]
int kqueue ( vacío );
Crea una nueva cola de eventos del kernel y devuelve un descriptor.
int kevent ( int kq , const struct kevent * lista de cambios , int ncambios , struct kevent * lista de eventos , int nevents , const struct timespec * tiempo de espera );
Se utiliza para registrar eventos en la cola y, a continuación, esperar y devolver los eventos pendientes al usuario. A diferencia de epoll , kqueue utiliza la misma función para registrar y esperar eventos, y se pueden registrar y modificar múltiples fuentes de eventos mediante una única llamada. La changelistmatriz se puede utilizar para pasar modificaciones (cambiar el tipo de eventos que se deben esperar, registrar nuevas fuentes de eventos, etc.) a la cola de eventos, que se aplican antes de que comience la espera de eventos. neventses el tamaño de la matriz suministrada por el usuario eventlistque se utiliza para recibir eventos de la cola de eventos.
EV_SET ( kev , ident , filtro , banderas , fflags , datos , udata );
Una macro que se utiliza para la inicialización conveniente de un struct keventobjeto.
Véase también
Bibliotecas independientes del sistema operativo con soporte para kqueue:
Equivalente de Kqueue para otras plataformas:
- en Solaris, Windows y AIX: puertos de finalización de E/S . Tenga en cuenta que los puertos de finalización notifican cuando se ha completado una operación solicitada, mientras que
kqueuetambién pueden notificar cuando un descriptor de archivo está listo para realizar una operación de E/S. - En Linux:
- La llamada al sistema epoll tiene una semántica similar pero no idéntica.
- inotify es un subsistema del kernel de Linux que detecta cambios en el sistema de archivos y los informa a las aplicaciones.
Referencias
- ^ abc Jonathan Lemon (2000). «kqueue, kevent — mecanismo de notificación de eventos del núcleo». Referencia cruzada de BSD . FreeBSD , OpenBSD , NetBSD , DragonFly BSD .
- "kqueue, kevent -- mecanismo de notificación de eventos del núcleo". Páginas del manual de FreeBSD.
- "kqueue, kevent, EV_SET — mecanismo de notificación de eventos del núcleo". Página del manual del servidor OpenBSD.
- "kqueue, kevent -- mecanismo de notificación de eventos del núcleo". Páginas del manual en línea de DragonFly.
- ^ abc Jonathan Lemon (1 de mayo de 2001). Kqueue: una herramienta genérica y escalable para la notificación de eventos (PDF) . Actas de la Conferencia técnica anual de USENIX de FREENIX Track 2001. USENIX (publicado del 25 al 30 de junio de 2001).
- "KQueue: una herramienta de notificación de eventos genérica y escalable". Usenix .
- ^ "Métodos de procesamiento de conexión". nginx .org .
- ^ Andrew Alexeev (2012). "§14. nginx". En Amy Brown; Greg Wilson (eds.). La arquitectura de las aplicaciones de código abierto, volumen II: Estructura, escala y algunos trucos más intrépidos. Lulu.com . ISBN 9781105571817.
- ^ libkqueue en GitHub
- ^ – Manual de llamadas al sistema de FreeBSD
Enlaces externos
- – Manual de llamadas al sistema de FreeBSD
- libbrb_core implementa una abstracción para una base orientada a eventos, utilizando la llamada al sistema kqueue()
- Código fuente de FreeBSD de la llamada al sistema kqueue()
- Código fuente de OpenBSD de la llamada al sistema kqueue()
- Código fuente NetBSD de la llamada al sistema kqueue()
- Código fuente de DragonFly BSD de la llamada al sistema kqueue()