Exclusió mútua: diferència entre les revisions

Contingut suprimit Contingut afegit
Cap resum de modificació
Línia 1:
'''Exclusió mútua''', (comunament abreujada com '' mutex '' per '' mutual exclusion ''), es una expressió utilitzada en [[programació concurrent]] que fa referència al fet d'evitar l'accés simultani de dos fragments de codi a un recurs compartit (per exemple una cua, un comptador, etc). Així, aquests fragments de codi ([[secció crítica|seccions crítiques]]) s'han ''excloure mútuament'' per no provocar inconsistències en les dades que estan actualitzant.
 
En general, és necessari disposar de mecanismes adequats per garantir accés exclusiu en sistemes [[multitasca]] on diversos [[fil d'execució| fils d'execució]] poden intentar accedir a un recurs al mateix temps, o també en recursos que poden accedits en context d'interrupció de la [[CPU]].
 
La major part d'aquests recursos són els senyals, comptadors, cues i altres dades que s'empren en la comunicació entre el codi que s'executa quan es dóna servei a una [[interrupció]] i el codi que s'executa la resta del temps. Es tracta d'un problema de vital importància perquè, si no es prenen les precaucions degudes, una interrupció pot passar entre dues instruccions qualssevol del codi normal i això pot provocar greus errors.
 
La tècnica que s'utilitza normalment per aconseguir l'exclusió mútua és inhabilitar les [[interrupció|interrupcions]] durant el conjunt d'instruccions més petit que impedirà la corrupció de l'estructura compartida (la secció crítica). Això impedeix que el codi de la interrupció s'executi al mig de la secció crítica.
Línia 9:
En un sistema [[multiprocessador]] de memòria compartida, es fa servir l'operació indivisible [[test-and-setembre]] sobre una bandera, per esperar fins que l'altre processador la rebuig. L'operació test-and-setembre realitza les dues operacions sense alliberar el bus de memòria a un altre processador. Així, quan el codi deixa la secció crítica, s'aclareix la bandera. Això es coneix com [[spinlock|spin lock]] o [[espera activa]].
 
Alguns sistemes tenen instruccions multioperaciónmultioperació indivisibles similars a les anteriorment descrites per manipular les [[llista enllaçada|llistes enllaçades]] que s'utilitzen per les cues d'esdeveniments i altres [[estructura de dades|estructures de dades]] que els [[sistema operatiu|sistemes operatius]] fan servir comunament.
 
La majoria dels mètodes d'exclusió mútua clàssics intenten reduir la latència i espera activa mitjançant les cues i [[canvi de context|canvis de context]]. Alguns investigadors afirmen que les proves indiquen que aquests algorismes especials perden més temps del que estalvien.
Línia 19:
==Algorismes==
Els [[algorisme]]s d'''' exclusió mútua ''' que s'usen en [[programació concurrent]] per evitar l'ús simultani de recursos comuns, com a variables globals, per fragments de codi coneguts com a seccions crítiques.
 
Alguns exemples d'algorismes clàssics de exclusió mútua són:
* El [[algorisme de Dekker]].
* El [[algorisme de Peterson]].
 
Una forma habitual de garantir exclusió mútua en sistemes [[uni-processador]] es deshabilitar les interrupcions a l'entrada de la secció crítica i habilitar-les a la sortida. Aquesta solució, permet que mentre s'accedeix al recurs no hi hagi [[canvi de context|canvis de context]] deguts a una interrupció. En sistemes multi-processador de memòria compartida (per exemple [[SMP]]) s'utilitza una operació atòmica anomenada [[test-and-set]], que permet comprovar l'estat d'una adreça de memòria i actualitzar el seu valor en un sol pas (sense alliberar el bus de memòria). Així, el processador que vulgui accedir al recurs compartit entrarà en [[espera activa]] fins que processador que en aquell moment utilitza el recurs l'alliberi i re-inicii el valor d'una variable (aquesta tècnica s'anomena [[spinlock]]).
 
La majoria de les solucions estan encaminades maximitzar l'eficiència en l'us del processador, evitant en la mesura del possible efectes no desitjats tals com [[interbloqueig |l'interbloqueig]], la [[inanició (informàtica)|inanició]] de recursos o la [[inversió de prioritat]].
 
A nivell de programari, existeixen múltiples solucions per garantir exclusió mútua. Per exemple:
* L'ús de [[semàfor (programació)|semàfors]]
* L'ús de [[monitor (programació)|monitors]]
* El [[algorismepas de Dekkermissatges]].
 
Alguns exemples d'algorismes clàssics de exclusió mútua són:
 
* [[algorisme de Dekker|L'algorisme de Dekker]]
* [[algorisme de Peterson|L'algorisme de Peterson]]
* [[algorisme de Lamport|L'algorisme de Lamport]]
* El [[pas de missatges]]
 
== Vegeu també ==
La majoria de les solucions estan encaminades maximitzar l'eficiència en l'us del processador, evitant en la mesura del possible efectes no desitjats tals com [[interbloqueig |l'interbloqueig]], la [[inanició (informàtica)|inanició]] de recursos o la [[inversió de prioritat]].
* [[Tancament d'exclusió mútua]] o locks
* [[Semàfor (programació)|Semàfor]] (inventat per [[Edsger Dijkstra]])
* [[Monitor (concurrència)]] (inventat per [[CAR Hoare]]) (sense interbloquejos)
 
 
[[Categoria:Programació]]