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:
Reference
externí odkazy
- - Manuál systémových volání FreeBSD
- libbrb_core implementuje abstrakci pro základnu orientovanou na události pomocí
kqueue()systémového volání - FreeBSD zdrojový kód
kqueue()systémového volání - OpenBSD zdrojový kód
kqueue()systémového volání - Zdrojový kód NetBSD
kqueue()systémového volání - DragonFly BSD zdrojový kód
kqueue()systémového volání