Capítulo7 - Deadlock
Capítulo7 - Deadlock
Capítulo7 - Deadlock
Modelo de Sistema
Un sistema consta de un número finito de recursos, que se distribuyen entre una serie de
procesos en competición. Los recursos se dividen en varios tipos, contando cada uno de
ellos con varias instancias. Si un sistema tiene 2 CPU, entonces el tipo de recurso CPU
tiene 2 instancias.
Un proceso puede solicitar tantos recursos como necesite para llevar a cabo las tareas que
tenga asignadas.
En modo de operación normal, un proceso puede emplear un recurso solo siguiendo esta
secuencia:
Un conjunto de procesos estará en estado de interbloqueo cuando todos los procesos del
conjunto estén esperando a que se produzca un suceso que solo puede producirse como
resultado de la actividad de otro proceso del conjunto.
Considere un sistema con 3 unidades regrabables de CD. Suponga que cada proceso está
usando una de estas unidades. Si ahora cada proceso solicita otra unidad, los 3 procesos
entraran en estado de interbloqueo. Cada uno de ellos estará esperando a que se produzca
un suceso, “la liberación de la unidad regrabable.” Esto es un interbloqueo relativo a un
único tipo de recurso.
Sistema con impresora y unidad de DVD. Suponga que el proceso Pi está usando la
impresora y el proceso Pj la unidad de DVD. Si Pj solicita la impresora y Pi solicita la
unidad de DVD, se producirá un interbloqueo.
Los programas multi-hebra son buenos candidatos para los interbloqueos, porque las
distintas hebras pueden competir por la utilización de los recursos compartidos.
Caracterización de los Interbloqueos
En un interbloqueo los procesos nunca terminan de ejecutarse y los recursos del sistema
están ocupados, lo que impide que se inicien otros trabajos.
Condiciones Necesarias
Conjuntos
o P={P1,P2,P3}
o R={R1,R2,R3,R4}
o E={P1->R1, P2->R3, R1->P2, R2->P2, R2->P1,R3->P3}
Instancias de Recursos
o Una instancia del tipo de recurso R1
o Dos instancias del tipo de recurso R2
o Una instancia del tipo de recurso R3
o Tres Instancias del tipo de recurso R4
Estados de los procesos
o El proceso P1 retiene una instancia del tipo de recurso R2 y está esperando
una instancia del recurso R1.
o El proceso P2 retiene una instancia del tipo de recurso R1 y está esperando
una instancia del recurso R3.
o El proceso P3 retiene una instancia del tipo de recurso R3.
Si el grafo no contiene ningún ciclo, entonces ningún proceso del sistema está
interbloqueado. Si el grafo contiene un ciclo, entonces puede existir un interbloqueo.
Si cada tipo de recurso tiene exactamente una instancia, entonces la existencia de un ciclo
implica necesariamente que se ha producido un interbloqueo.
La tercera solución es la que usan la mayoría de los SO, entonces es problema del
desarrollador de aplicaciones el escribir programas que resuelvan posibles interbloqueos.
Prevención de Interbloqueos
Exclusión Mutua
Se aplica a los recursos que no pueden ser compartidos. Los recursos compartibles no
requieren acceso mutuamente excluyente. Por ejemplo, varios procesos no pueden
compartir simultáneamente una impresora.
Los archivos de solo lectura son ejemplos de recursos que pueden compartirse. Si varios
procesos intentan abrir un archivo de solo lectura al mismo tiempo, puede concedérseles
acceso al archivo de forma simultánea.
Retención y Espera
Para asegurar que esta condición nunca se produzca debemos garantizar que cuando un
proceso solicite un recurso el proceso no este reteniendo ningún otro recurso. Un posible
protocolo consiste en exigir que cada proceso solicite todos sus recursos antes de comenzar
su ejecución.
Una posible alternativa seria un protocolo que permitiera a un proceso solicitar recursos
solo cuando no tenga ninguno retenido.
Sin Desalojo
Una forma de garantizar que esta condición nunca se produzca es imponer una ordenación
total de todos los tipos de recursos y requerir que cada proceso solicite sus recursos en un
orden creciente de numeración.
Podemos considerar el siguiente protocolo para impedir los interbloqueos: cada proceso
puede solicitar los recursos solo en orden creciente de numeración es decir, un proceso
puede solicitar cualquier numero distancias de un cierto tipo de recurso como por ejemplo
Ri; a continuación el proceso puede solicitar instancias del tipo de recursos Rj si y solo si
F(Rj)>F(Ri).
Si se usan estos dos protocolos entonces la condición de espera circular no puede llegar a
cumplirse.
Evasión de Interbloqueos
Detección de Interbloqueos
Si un sistema no emplea ni algoritmos de prevención ni de evasión de interbloqueos,
entonces puede producirse un interbloqueo en el sistema. En este caso el sistema debe
proporcionar:
Si todos los recursos tienen una única instancia, entonces podemos definir un algoritmo de
detección de interbloqueos que utilice una variante del grafo de asignación de recursos,
denominada grafo de espera. Se eliminan los nodos de recursos y se colapsan las
correspondientes aristas.
Existirá un interbloqueo en el sistema si y solo si el grafo de espera contiene un ciclo. Para
detectar interbloqueos, el sistema necesita mantener el grafo de espera e invocar un
algoritmo periódicamente que compruebe si existe un ciclo en el grafo.
Si se invoca el algoritmo de detección para cada solicitud de recursos, esto dará lugar a una
considerable sobrecarga en el tiempo de uso del procesador. Una alternativa, consiste
simplemente en invocar el algoritmo a intervalos menos frecuentes, por ejemplo cuando la
utilización de la CPU caiga por debajo del 40%.
Recuperación de un Interbloqueo
Cuando el algoritmo de detección determina que existe un interbloqueo, tenemos varias
alternativas. Una es informar al operador que se ha producido un interbloqueo y dejar que
lo trate de forma manual. Otra es dejar que el sistema haga la recuperación del interbloqueo
de forma automática.
Para eliminar los interbloqueos interrumpiendo un proceso se utiliza uno de dos posibles
métodos:
Apropiación de Recursos
Se desalojan de forma sucesiva los recursos de los procesos y asignamos dichos recursos a
otros procesos hasta que el ciclo de interbloqueos se interrumpa.
Selección de una víctima. De que recursos hay que apropiarse y de que procesos.
Es necesario determinar el orden de apropiación de forma de que se minimicen los
costes.
Anulación. Si nos apropiamos de un recurso de un proceso, ¿qué debería hacerse
con este proceso? Debemos devolver el proceso a un estado seguro y reiniciarlo a
partir de dicho estado.
Inanición. ¿Cómo se puede asegurar que no se produzca la muerte por inanición de
un proceso es decir que los recursos no se tomen siempre del mismo proceso? Puede
ocurrir que siempre se elija el mismo proceso como víctima. Como resultado este
proceso nunca completara sus tareas dando lugar a una situación de inanición.
Debemos asegurar que cada proceso pueda ser seleccionado como víctima solo un
numero finito (pequeño) de veces.