Kqueue
| Tipus | crida de sistema, programari de codi obert i programari lliure |
|---|---|
| Característiques tècniques | |
| Sistema operatiu | FreeBSD, OpenBSD, NetBSD i DragonFly BSD |
| Equip | |
| Creador/s | Jonathan Lemon |
kqueue és una interfície de notificació d'esdeveniments del nucli del sistema operatiu utilitzada principalment en sistemes de la família BSD i en macOS. Permet a una aplicació registrar descriptors de fitxer, sòcols o altres fonts d'esdeveniments i rebre notificacions quan es produeix una condició determinada, com ara la disponibilitat de dades per llegir, la possibilitat d'escriure, un canvi en un fitxer, un senyal o l'activació d'un temporitzador.[1]
Aquest mecanisme s'utilitza en el context de la multiplexació d'entrada/sortida, ja que permet gestionar diverses fonts d'entrada i sortida sense dedicar necessàriament un fil d'execució independent a cadascuna. En aplicacions de xarxa, per exemple, kqueue pot ajudar a controlar moltes connexions concurrents mitjançant sòcols no bloquejants i notificacions generades pel sistema operatiu.
Funcionament
[modifica]El funcionament de kqueue es basa en una cua d'esdeveniments mantinguda pel nucli. La crida de sistema kqueue() crea una nova cua d'esdeveniments i retorna un descriptor associat a aquesta cua. La crida kevent() s'utilitza tant per registrar o modificar esdeveniments d'interès com per obtenir els esdeveniments pendents que el nucli ha detectat.[1]
Cada esdeveniment registrat es representa mitjançant una estructura kevent, que inclou, entre altres camps, un identificador, un filtre, un conjunt de banderes i dades associades. L'identificador sol correspondre a un descriptor de fitxer, tot i que la interpretació exacta depèn del filtre utilitzat. El filtre determina quin tipus d'esdeveniment es vol observar, com ara lectura, escriptura, senyals, processos, canvis en fitxers o temporitzadors.[1]
Quan es produeix una condició que compleix els criteris registrats, el nucli col·loca l'esdeveniment a la cua perquè l'aplicació el pugui recuperar. D'aquesta manera, el programa no necessita comprovar constantment l'estat de tots els descriptors. En lloc d'això, pot esperar fins que el sistema operatiu indiqui quins esdeveniments estan preparats per ser processats.
Relació amb l'E/S no bloquejant
[modifica]kqueue és especialment útil en models d'entrada/sortida no bloquejant. En un model bloquejant, una operació de lectura o escriptura pot aturar l'execució del programa fins que hi hagi dades disponibles o fins que l'operació es pugui completar. En canvi, amb E/S no bloquejant, l'aplicació pot continuar executant altres tasques mentre espera que el sistema operatiu notifiqui que una operació està preparada.
Aquest enfocament és habitual en servidors de xarxa i aplicacions amb moltes connexions simultànies. En lloc de crear un fil per a cada connexió, el programa pot registrar diversos descriptors en una mateixa cua d'esdeveniments i processar-los a mesura que es van activant. Això pot reduir el cost associat a la creació i gestió de fils i evitar esperes innecessàries quan una connexió encara no té dades disponibles.
Comparació amb altres mecanismes
[modifica]kqueue forma part d'una família de mecanismes de notificació i multiplexació d'E/S que inclou també select, poll, epoll i els ports de compleció d'E/S. Les interfícies select i poll són més antigues i permeten esperar esdeveniments en diversos descriptors, però poden resultar menys adequades quan el nombre de descriptors és elevat. En sistemes Linux, una funció semblant és proporcionada per epoll, mentre que en sistemes Windows s'utilitzen habitualment els ports de compleció d'E/S.[2]
El mòdul selectors de Python ofereix una abstracció d'alt nivell sobre aquests mecanismes. Segons la plataforma, pot utilitzar implementacions concretes com KqueueSelector o EpollSelector per esperar notificacions de disponibilitat d'E/S en diversos objectes de fitxer.[3]
Ús en bucles d'esdeveniments
[modifica]Els bucles d'esdeveniments poden utilitzar mecanismes com kqueue per esperar de manera eficient que es produeixin operacions d'entrada i sortida. El bucle registra els recursos que vol observar i queda a l'espera fins que el sistema operatiu notifica que algun d'aquests recursos està preparat. Quan arriba una notificació, el bucle pot executar el codi associat a aquell esdeveniment i després continuar esperant nous esdeveniments.
Aquest model és una de les bases de la concurrència orientada a esdeveniments. Permet que una aplicació gestioni moltes operacions d'E/S dins d'un mateix procés o fil, sempre que les operacions llargues es deleguin al sistema operatiu i el programa només reprengui el treball quan hi hagi un esdeveniment pendent de processar.
Sistemes compatibles
[modifica]kqueue es va introduir en FreeBSD i posteriorment ha estat implementat o suportat en altres sistemes de la família BSD, com NetBSD, OpenBSD i DragonFly BSD, així com en macOS.[4] En altres sistemes operatius s'utilitzen mecanismes diferents amb finalitats semblants, com epoll en Linux.
Referències
[modifica]- 1 2 3 «kqueue». FreeBSD Manual Pages. [Consulta: 5 maig 2026].
- ↑ Fowler, Matthew. «3». A: Python Concurrency with asyncio. Manning Publications, 2022. ISBN 9781617298660.
- ↑ «selectors — High-level I/O multiplexing». Python 3 documentation. [Consulta: 5 maig 2026].
- ↑ «kqueue(2)». OpenBSD manual pages. [Consulta: 5 maig 2026].