kqueue - kqueue

Kqueue je škálovatelné rozhraní pro oznámení událostí zavedené ve FreeBSD 4.1 v červenci 2000, podporované také v NetBSD , OpenBSD , DragonFly BSD a macOS . Autorem Kqueue byl v roce 2000 Jonathan Lemon, poté spolupracoval s týmem FreeBSD Core . Kqueue umožňuje softwaru jako nginx vyřešit problém c10k .

Kqueue poskytuje efektivní kanály vstupních a výstupních událostí mezi jádrem a uživatelskou zemí . Je tedy možné upravovat filtry událostí i přijímat čekající události při použití pouze jediného systémového volání na iteraci smyčkykevent(2) hlavní události . To je v rozporu se staršími tradiční dotazování systémových volání, jako jsou poll(2)a select(2)které jsou méně účinné, a to zejména při dotazování na události na řadu popisovačů souboru.

Kqueue nejen zpracovává události deskriptoru souboru, ale používá se také pro různá další oznámení, jako je monitorování změn souborů , signály , asynchronní I/O události (AIO), sledování změn stavu podřízených procesů a časovače, které podporují rozlišení nanosekund , navíc kqueue poskytuje způsob používat kromě událostí poskytovaných jádrem uživatelem definované události.

Některé další operační systémy, které tradičně pouze podporovaly select(2)a poll(2)také v současné době poskytují efektivnější alternativy dotazování, jako například epoll na Linuxu a porty dokončení I/O ve Windows a Solarisu .

libkqueueje implementace uživatelského prostorukqueue(2) , která překládá volání do mechanismu událostí nativního backendu operačního systému.

API

Prototypy a typy funkcí se nacházejí v sys/event.h.

int kqueue(void);

Vytvoří novou frontu událostí jádra a vrátí deskriptor.

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

Slouží k registraci událostí ve frontě, poté počkejte a vraťte všechny nevyřízené události uživateli. Na rozdíl od epoll , kqueue používá stejnou funkci k registraci a čekání na události a více zdrojů událostí lze registrovat a upravovat pomocí jediného volání. changelistPole lze použít k povolení změny (změna typu událostí čekat, registraci nových zdrojů událostí, atd) do fronty událostí, které jsou aplikovány před čeká na události začíná. neventsje velikost eventlistpole dodaného uživatelem, které se používá k přijímání událostí z fronty událostí.

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

Makro, které se používá pro pohodlnou inicializaci struct keventobjektu.

Viz také

Knihovny nezávislé na operačním systému s podporou kqueue:

Kqueue ekvivalent pro jiné platformy:

  • na portech Solaris, Windows a AIX: I/O dokončení . Všimněte si toho, že dokončovací porty upozorňují na dokončení požadované operace, zatímco kqueuemohou také upozornit, když je deskriptor souboru připraven k provedení operace I/O.
  • na Linuxu:
    • systémové volání epoll má podobnou, ale ne identickou sémantiku.
    • inotify je subsystém jádra Linuxu, který zaznamenává změny v souborovém systému a hlásí je aplikacím.

Reference

externí odkazy