Kqueue es una interfaz de notificación de eventos escalable introducida en FreeBSD 4.1 en julio de 2000, [1] [2] también es compatible con NetBSD , OpenBSD , DragonFly BSD y macOS . Kqueue fue escrito originalmente en 2000 por Jonathan Lemon, [1] [2] luego involucrado con el Equipo Central de FreeBSD . Kqueue hace posible que software como nginx resuelva el problema de c10k . [3] [4]
Kqueue proporciona canales de eventos de entrada y salida eficientes entre el kernel y el área de usuario . Por lo tanto, es posible modificar los filtros de eventos, así como recibir eventos pendientes utilizando solo una única llamada al sistemakevent(2)
por 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 descriptor de archivos , sino que también se usa para varias otras notificaciones, como monitoreo de modificación de archivos , señales , eventos de E / S asíncronos (AIO), monitoreo de cambio de estado de procesos secundarios y temporizadores que admiten resolución de nanosegundos , además kqueue proporciona una para utilizar eventos definidos por el usuario además de los proporcionados por el kernel.
Algunos otros sistemas operativos que tradicionalmente solo eran compatibles select(2)
y que poll(2)
actualmente ofrecen alternativas de sondeo más eficientes, como epoll en Linux y puertos de finalización de E / S en Windows y Solaris .
libkqueue
es una implementación de espacio de usuario de kqueue(2)
, que traduce las llamadas al mecanismo de eventos de backend nativo de un sistema operativo. [5]
API [6]
Los prototipos y tipos de funciones se encuentran en sys/event.h
.
int kqueue ( vacío );
Crea una nueva cola de eventos del kernel y devuelve un descriptor.
int kevent ( int kq , const struct kevent * changelist , int nchanges , struct kevent * eventlist , int nevents , const struct timespec * timeout );
Se usa para registrar eventos con la cola, luego esperar y devolver cualquier evento pendiente al usuario. A diferencia de epoll , kqueue usa la misma función para registrar y esperar eventos, y se pueden registrar y modificar múltiples fuentes de eventos usando una sola llamada. La changelist
matriz se puede utilizar para pasar modificaciones (cambiar el tipo de eventos a esperar, registrar nuevas fuentes de eventos, etc.) a la cola de eventos, que se aplican antes de que comience la espera. nevents
es el tamaño de la eventlist
matriz proporcionada por el usuario que 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 kevent
objeto.
Ver también
Bibliotecas independientes del sistema operativo con soporte para kqueue:
Equivalente de Kqueue para otras plataformas:
- en Solaris, Windows y AIX: I / O puertos de finalización . Tenga en cuenta que los puertos de finalización notifican cuando se completa una operación solicitada, mientras
kqueue
que también pueden notificar cuando un descriptor de archivo está listo para realizar una operación de E / S. - en Linux:
Referencias
- ↑ a b Jonathan Lemon (2000). "kqueue, kevent - mecanismo de notificación de eventos del kernel" . Referencia cruzada BSD . FreeBSD , OpenBSD , NetBSD , DragonFly BSD . Lay resumen .
- ^ a b Jonathan Lemon (1 de mayo de 2001). Kqueue: una función de notificación de eventos genérica y escalable (PDF) . Actas de FREENIX Track: 2001 Conferencia técnica anual de USENIX . USENIX (publicado del 25 al 30 de junio de 2001). Lay resumen .
- ^ "Métodos de procesamiento de conexiones" . 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 FreeBSD
enlaces externos
- - Manual de llamadas al sistema FreeBSD
- libbrb_core implementa una abstracción para una base orientada a eventos, usando una kqueue()llamada al sistema
- Código fuente FreeBSD de la kqueue()llamada al sistema
- Código fuente OpenBSD de la kqueue()llamada al sistema
- Código fuente NetBSD de la kqueue()llamada al sistema
- Código fuente DragonFly BSD de la kqueue()llamada al sistema