epoll és una interfície de notificació d'esdeveniments d'entrada/sortida del nucli de Linux que permet supervisar múltiples descriptors de fitxer i saber quan algun d'ells està preparat per llegir o escriure. Té una funció semblant a select i poll, però està pensada per escalar millor quan un programa ha de gestionar moltes connexions alhora, com passa en servidors de xarxa o en aplicacions basades en bucles d'esdeveniments.

Funcionament Epoll crea una instància gestionada pel nucli. Aquesta instància manté una llista d'interès, amb els descriptors que el programa vol vigilar, i una llista de preparats, amb els descriptors on el nucli ha detectat activitat d'entrada/sortida. Les crides principals són epoll_create o epoll_create1, per crear la instància; epoll_ctl, per afegir, modificar o eliminar descriptors, i epoll_wait, per esperar fins que hi hagi esdeveniments disponibles.

La interfície pot treballar en mode activat per nivell (level-triggered), que és el comportament per defecte, o en mode activat per flanc (edge-triggered). En aquest segon mode, activat amb EPOLLET, el programa ha d'utilitzar descriptors no bloquejants i llegir o escriure fins que l'operació no pugui continuar temporalment, habitualment amb l'error EAGAIN.

Relació amb Python asyncio Epoll és rellevant per entendre Python asyncio perquè forma part dels mecanismes de notificació que permeten implementar E/S no bloquejant. Fowler descriu epoll com el mecanisme utilitzat a Linux dins d'una família que també inclou kqueue a FreeBSD i macOS i IOCP a Windows; aquests sistemes avisen el bucle d'esdeveniments quan els sòcols no bloquejants estan preparats per continuar.

En Python, el mòdul select exposa objectes epoll en sistemes Linux compatibles. El mòdul selectors inclou EpollSelector, i DefaultSelector tria automàticament la implementació més eficient disponible a la plataforma. En l'ús habitual d'asyncio, el programador no treballa directament amb epoll, sinó amb corutines, tasques i fluxos d'alt nivell.

Vegeu també Bucle d'esdeveniments E/S asíncrona kqueue Linux (nucli)

Referències

Categoria:Linux (nucli)