En programació, espera activa (o busy waiting) és una tècnica en la qual un procés o un fil d'execució comprova repetidament si una condició és certa, per exemple, per saber si l'accés a una secció crítica està habilitat.

L'espera activa consumeix temps de CPU sense realitzar cap operació i, per tant, ha de ser emprada amb cura. Una aplicació comuna és la implementació de spinlocks en els sistemes operatius dissenyats per funcionar en sistemes multiprocessador (SMP).

Hi ha diverses alternatives a l'ús d'esperes actives. La majoria de sistemes operatius proveeixen crides de sistema que permeten bloquejar un procés en un esdeveniment, com l'adquisició d'un semàfor, un rellotge de sistema, la disponibilitat d'un dispositiu d'entrada/sortida (I/O), etc., essent així innecessari realitzar espera activa. El planificador (scheduler) del sistema operatiu suspèn el procés i permet que la CPU sigui utilitzada per altres processos.

Si és absolutament necessari realitzar una espera, es pot fer ús de funcions d'espera (delay) que són crides de sistema disponibles en la majoria de sistemes operatius. Aquestes funcions suspenen temporalment el procés o el fil d'execució que s'estava processant i, per tant, no s'utilitzarà temps de CPU mentre duri la suspensió. Malgrat tot, en certs casos les esperes actives desitjables. Per exemple, en la implementació de controladors de baix nivell per a maquinari, on no és pràctic utilitzar senyalització mitjançant interrupcions. A vegades les esperes són de fet la forma més ràpida d'accedir a certes dades. Per exemple, pot ser necessari escriure dades de control a un dispositiu i llavors llegir algunes dades d'aquest que no són valides fins al cap de diversos cicles de rellotge. Si per exemple cridem una funció de sistema per retardar la lectura, pot ser que el temps involucrat en execució sigui molt major que el temps que volem estar esperant (degut a la sobrecàrrega involucrada en la crida a aquesta funció).

Relació amb la concurrència i l'entrada/sortida no bloquejant En programació concurrent, l'espera activa pot aparèixer quan diversos processos, fils o tasques competeixen per un mateix recurs o esperen que una operació externa finalitzi. Si el programa comprova repetidament l'estat d'una variable, d'un dispositiu o d'una operació d'entrada/sortida sense suspendre's, pot consumir temps de CPU que podria ser utilitzat per altres tasques.

Aquesta situació és especialment rellevant en programes que gestionen moltes operacions d'entrada/sortida, com ara connexions de xarxa, fitxers o comunicació amb bases de dades. En aquests casos, una estratègia basada en espera activa pot reduir la capacitat de resposta del sistema i empitjorar el rendiment global. Per aquest motiu, els sistemes operatius i les biblioteques de concurrència ofereixen mecanismes que permeten esperar esdeveniments sense mantenir ocupat el processador.

En els models de programació asíncrona, una tasca pot cedir el control quan ha d'esperar una operació d'entrada/sortida i reprendre's més endavant. En lloc de comprovar contínuament si una operació ha acabat, el programa pot utilitzar mecanismes de notificació, selectors o un bucle d'esdeveniments. En Python, la biblioteca asyncio permet escriure codi concurrent amb la sintaxi async i await, de manera que una corutina pot suspendre la seva execució mentre espera una operació i deixar que altres tasques avancin dins del mateix bucle d'esdeveniments.

Alternatives en programació concurrent Una alternativa habitual a l'espera activa és bloquejar el procés o el fil fins que es produeixi l'esdeveniment esperat. Quan això passa, el planificador del sistema operatiu pot assignar la CPU a altres processos. També es poden utilitzar primitives de sincronització com semàfors, variables de condició, cues de missatges o mecanismes de notificació d'entrada/sortida.

En el cas de sockets i altres canals d'entrada/sortida, una tècnica habitual és la multiplexació d'E/S, que permet esperar diversos descriptors alhora i continuar només quan algun d'ells està preparat per llegir o escriure. Aquest enfocament evita haver de consultar repetidament cada recurs en un bucle ocupat.

En aplicacions asíncrones, les operacions esperables substitueixen sovint els bucles de comprovació contínua. Per exemple, una tasca pot esperar la resposta d'una connexió de xarxa sense ocupar la CPU mentre espera. Això és especialment útil en servidors, clients de xarxa i aplicacions que han de gestionar moltes operacions simultànies d'entrada/sortida.

Vegeu també Concurrència Fil d'execució Procés (informàtica) Semàfor (informàtica) Exclusió mútua Spinlock Programació asíncrona Entrada/sortida Planificador

Referències

Categoria:Programació Categoria:Sistemes operatius