Multiplexació d'entrada/sortida o multiplexació d'E/S és una tècnica de programació de sistemes que permet a un programa esperar simultàniament diversos canals d'entrada/sortida i continuar quan algun d'ells està preparat per fer una operació. En lloc de bloquejar-se en una única lectura o escriptura, el programa registra o passa un conjunt de recursos al sistema operatiu i rep informació sobre quins poden avançar sense bloquejar-se.Matthew Fowler, Python Concurrency with asyncio, Manning, 2022, capítol 3 i secció 14.5.

La tècnica és habitual en servidors de xarxa, biblioteques asíncrones i sistemes orientats a esdeveniments. És especialment útil quan un programa ha de mantenir moltes connexions obertes però la major part del temps espera dades, noves connexions o capacitat d'escriptura. En aquests casos, la multiplexació pot reduir la necessitat d'assignar un fil bloquejat a cada connexió.

Model general El model parteix d'un conjunt de descriptors de fitxer, sòcols o altres objectes d'E/S. El programa indica quins esdeveniments vol observar, com disponibilitat per llegir, disponibilitat per escriure o condicions d'error. Després invoca una operació d'espera conjunta. Quan un o més recursos esdevenen preparats, el sistema retorna aquesta informació i el programa executa l'operació concreta sobre els descriptors corresponents.

Aquest enfocament substitueix l'espera seqüencial sobre cada recurs per una espera agregada. Sense multiplexació, un servidor que volgués atendre molts clients podria quedar bloquejat esperant dades d'un sol client mentre altres ja en tenen disponibles.

La multiplexació d'E/S no és exactament el mateix que l'E/S asíncrona completa. En molts models de multiplexació, el sistema només informa que una operació no bloquejaria; la lectura o escriptura real la fa després el programa.

Primitives habituals En sistemes Unix i similars, la multiplexació d'E/S s'ha implementat tradicionalment amb crides com select i poll. La crida select treballa amb conjunts de descriptors per a lectura, escriptura i condicions excepcionals, mentre que poll associa cada descriptor amb una màscara d'esdeveniments sol·licitats i una màscara d'esdeveniments retornats.«select(2)», Linux manual page, consulta 27 abril 2026, https://man7.org/linux/man-pages/man2/select.2.html«poll(2)», Linux manual page, consulta 27 abril 2026, https://man7.org/linux/man-pages/man2/poll.2.html

Altres mecanismes, com epoll a Linux, mantenen una estructura de registre d'interessos dins del sistema operatiu i poden escalar millor quan hi ha molts descriptors vigilats.«epoll(7)», Linux manual page, consulta 27 abril 2026, https://man7.org/linux/man-pages/man7/epoll.7.html Biblioteques d'alt nivell poden amagar aquestes diferències d'implementació darrere d'una interfície comuna, com passa amb els selectors.«selectors — High-level I/O multiplexing», Python 3 Standard Library, consulta 27 abril 2026, https://docs.python.org/3/library/selectors.html

Selectors Un selector és una abstracció d'alt nivell sobre la multiplexació d'E/S. En lloc de fer servir directament select, poll, epoll o kqueue, el programa interactua amb una interfície comuna que permet registrar recursos, modificar-ne els esdeveniments d'interès, esperar notificacions i desregistrar-los.

La biblioteca estàndard de Python defineix el mòdul selectors com una capa d'alt nivell per a multiplexació d'E/S construïda sobre les primitives del mòdul select. En aquesta abstracció, DefaultSelector és un àlies a la implementació més eficient disponible en la plataforma actual.

Un registre de selector acostuma a associar el recurs vigilat amb els esdeveniments d'interès i amb dades auxiliars del programa, com l'estat d'una connexió o la funció que s'haurà d'executar. Això permet separar la decisió de quin descriptor és preparat de la lògica específica que tracta aquell descriptor.

Relació amb el bucle d'esdeveniments La multiplexació d'E/S és una de les bases habituals dels bucles d'esdeveniments. El bucle necessita saber quan una operació externa pot continuar; el mecanisme de multiplexació li proporciona aquesta informació per a moltes fonts alhora. En Python, la documentació del mòdul asyncio distingeix entre implementacions de bucle basades en selectors i implementacions basades en altres mecanismes, com els ports de compleció d'E/S en Windows.«Event Loop», Python 3 Standard Library, consulta 27 abril 2026, https://docs.python.org/3/library/asyncio-eventloop.html

Limitacions La multiplexació d'E/S no elimina tots els costos. El programa continua havent de gestionar l'estat de cada connexió, lectures parcials, escriptures parcials, errors, tancaments i temps d'espera. A més, si el treball associat a cada esdeveniment és intensiu en CPU, el model pot deixar de ser eficient perquè el fil que processa els esdeveniments queda ocupat.

La disponibilitat indicada pel sistema tampoc garanteix que una operació gran es completi íntegrament. Un sòcol pot ser escrivible només per a una quantitat limitada de bytes, o una lectura pot retornar només una part de les dades esperades. Per això, la multiplexació sol combinar-se amb descriptors no bloquejants i amb codi preparat per reprendre operacions parcials.

Vegeu també Bucle d'esdeveniments Programació asíncrona Socket d'Internet Entrada/sortida

Referències

Categoria:Programació