Abraçada mortal

De Viquipèdia
Dreceres ràpides: navegació, cerca
Exemple de representació de de Bloqueig Mutu en grafs d'al·locació de recursos amb dos processos A i B , i dos recursos R1 i R2 .

Una abraçada mortal (també coneguda com a deadlock ó interbloqueig) és una situació on dues o més accions s'esperen mútuament, incapaces de seguir fins que les altres no acabin, i, per tant, cap d'elles no acaba mai. Apareix sovint a les paradoxes, com el sopar de filòsofs.

En informàtica, abraçada mortal es refereix a un problema específic on dos o més processos esperen el mateix recurs compartit. En el context de bases de dades, es refereix a la possibilitat d'una espera infinita quan un SGBD fa el control de concurrència mitjançant un sistema de reserves. Les abraçades mortals són un problema habitual de concurrència, on diversos processos comparteixen un tipus específic de recurs mutualment exclusiu anomenat mutex. Són especialment problemàtiques perquè no hi ha una solució general per a resoldre abraçades mortals.

Condicions necessàries[modifica | modifica el codi]

  1. Exclusió mútua: un recurs o bé és assignat a un sol procés o bé està disponible.
  2. "Agafar i esperar": els processos que han bloquejat un recurs poden seguir bloquejant-ne d'altres.
  3. No apropiació: només pot alliberar un recurs el procés que l'ha bloquejat (no és possible l'alliberament forçat)
  4. Espera circular: dos o més processos formen una cadena on cada procés espera el recurs que el següent procés té bloquejat.

Evitar abraçades mortals[modifica | modifica el codi]

Les abraçades mortals poden evitar-se si tenim certa informació a priori sobre el bloqueig dels recursos. Per cada petició de bloqueig el sistema pot comprovar si el fet d'assignar el recurs al procés que el demana durà el sistema a un estat insegur, entenent com a estat insegur aquell on l'abraçada mortal és possible. Si tenim, doncs, la capacitat de fer aquesta comprovació, el sistema només assignarà un recurs quan aquesta assignació mantingui el sistema en un estat segur. Tanmateix, en molts sistemes no és possible saber d'antuvi si un estat és segur o insegur, i per tant no tenim un algorisme genèric per a evitar abraçades mortals.

Prevenció d'abraçades mortals[modifica | modifica el codi]

Podem prevenir l'aparició d'abraçades mortals assegurant que una de les quatre condicions d'abans no succeeix. D'aquestes condicions la que habitualment és més senzilla d'evitar és l'espera circular: podem imposar un ordre en l'adquisició de recursos, de tal manera que no puguin produir-se esperes circulars.

Detecció d'abraçades mortals[modifica | modifica el codi]

A vegades no és possible de prevenir ni evitar les abraçades mortals. En aquests casos s'empra un algorisme de detecció d'abraçades mortals, que cerca esperes circulars i mata un o més dels processos involucrats per a desfer l'abraçada mortal.

Livelock o Atzucac viu[modifica | modifica el codi]

Un Atzucac viu o livelock és similar a un deadlock , excepte que els estats dels dos processos implicats al livelock canvien constantment l'un respecte a l'altre.

El Livelock és una forma d'inanició (informàtica) encara que la definició general de l'error només especificarà que un procés determinat no s'està processant.

En un exemple del món real, un livelock passa per exemple quan dues persones, es troben en un passadís estret avançant en sentits oposats, i cadascuna tracta de ser amable movent-se a un costat per deixar passar l'altra persona, però acaben movent-se de costat a costat totes dues sense aconseguir res, ja que ambdues es mouen cap al mateix costat.. al mateix temps.

Livelock és un risc amb alguns algorismes que detecten i recuperen els interbloquejos, perquè si més d'un pren cartes en l'assumpte, la detecció del interbloqueig es pot disparar contínuament. Es pot arreglar assegurant que només un procés (escollit a l'atzar o per prioritat) prengui acció.

Vegeu també[modifica | modifica el codi]