wacht - kqueue

Kqueue is een schaalbare interface voor het melden van gebeurtenissen die in juli 2000 werd geïntroduceerd in FreeBSD 4.1 en ook wordt ondersteund in NetBSD , OpenBSD , DragonFly BSD en macOS . Kqueue is oorspronkelijk geschreven in 2000 door Jonathan Lemon, toen betrokken bij het FreeBSD Core Team . Kqueue maakt het mogelijk voor software zoals nginx om het c10k-probleem op te lossen .

Kqueue biedt efficiënte input- en output-gebeurtenispipelines tussen de kernel en userland . Aldus is het mogelijk gebeurtenisfilters passen en lopende gebeurtenissen ontvangen terwijl die maar één system call om kevent(2)per main event lus iteratie. Dit in tegenstelling tot oudere traditionele pollingsysteemaanroepen zoals poll(2)en select(2)die minder efficiënt zijn, vooral bij het pollen naar gebeurtenissen op talrijke bestandsdescriptors.

Kqueue verwerkt niet alleen bestandsdescriptorgebeurtenissen , maar wordt ook gebruikt voor verschillende andere meldingen, zoals bewaking van bestandswijzigingen , signalen , asynchrone I/O- gebeurtenissen (AIO), bewaking van statuswijzigingen van onderliggende processen en timers die resolutie van nanoseconden ondersteunen . Bovendien biedt kqueue een manier om door de gebruiker gedefinieerde gebeurtenissen te gebruiken naast de gebeurtenissen die door de kernel worden geleverd.

Enkele andere besturingssystemen die traditioneel alleen efficiëntere pollingalternatieven ondersteunden select(2)en poll(2)momenteel ook bieden, zoals epoll op Linux en I/O-voltooiingspoorten op Windows en Solaris .

libkqueueis een gebruikersruimte- implementatie van kqueue(2), die oproepen vertaalt naar het native backend-gebeurtenismechanisme van een besturingssysteem.

API

De functie-prototypes en typen zijn te vinden in sys/event.h.

int kqueue(void);

Creëert een nieuwe kernelgebeurteniswachtrij en retourneert een descriptor.

int kevent(int kq, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout);

Wordt gebruikt om gebeurtenissen in de wachtrij te registreren en vervolgens te wachten op gebeurtenissen die in behandeling zijn en deze terug te sturen naar de gebruiker. In tegenstelling tot epoll gebruikt kqueue dezelfde functie om te registreren en te wachten op gebeurtenissen, en meerdere gebeurtenisbronnen kunnen worden geregistreerd en gewijzigd met een enkele oproep. De changelistarray kan worden gebruikt om wijzigingen (het wijzigen van het type gebeurtenissen waarop moet worden gewacht, het registreren van nieuwe gebeurtenisbronnen, enz.) door te geven aan de gebeurteniswachtrij, die worden toegepast voordat het wachten op gebeurtenissen begint. neventsis de grootte van de door de gebruiker geleverde eventlistarray die wordt gebruikt om gebeurtenissen uit de gebeurteniswachtrij te ontvangen.

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

Een macro die wordt gebruikt voor gemakkelijke initialisatie van een struct keventobject.

Zie ook

OS-onafhankelijke bibliotheken met ondersteuning voor kqueue:

Kqueue-equivalent voor andere platforms:

  • op Solaris, Windows en AIX: I/O-voltooiingspoorten . Merk op dat voltooiingspoorten melden wanneer een gevraagde bewerking is voltooid, terwijl kqueueze ook kunnen melden wanneer een bestandsdescriptor gereed is om een ​​I/O-bewerking uit te voeren.
  • op Linux:
    • epoll- systeemaanroep heeft vergelijkbare maar niet identieke semantiek.
    • inotify is een Linux- kernelsubsysteem dat wijzigingen in het bestandssysteem opmerkt en deze aan toepassingen rapporteert.

Referenties

Externe links