kqueue - kqueue

Kqueue es una interfaz de notificación de eventos escalable introducida en FreeBSD 4.1 en julio de 2000, también compatible con NetBSD , OpenBSD , DragonFly BSD y macOS . Kqueue fue creado originalmente en 2000 por Jonathan Lemon, luego involucrado con el equipo principal de FreeBSD . Kqueue hace posible que software como nginx resuelva el problema de c10k .

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 y recibir eventos pendientes mientras se usa 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 forma 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 .

libkqueuees 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.

API

Los prototipos y tipos de funciones se encuentran en sys/event.h.

int kqueue(void);

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 changelistmatriz 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. neventses el tamaño de la eventlistmatriz proporcionada por el usuario que se utiliza para recibir eventos de la cola de eventos.

EV_SET(kev, ident, filter, flags, fflags, data, udata);

Una macro que se utiliza para la inicialización conveniente de un struct keventobjeto.

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 ha completado una operación solicitada, mientras kqueueque tambié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

enlaces externos