6 Interbloqueos de procesos
En los sistemas operativos, el interbloqueo de procesos (también llamado bloqueo mutuo o abrazo mortal) es el bloqueo permanente de un conjunto de procesos o hilos de ejecución en un sistema concurrente que compiten por un número finito de recursos.
Cuando varios procesos compiten por un número finito de recursos puede surgir una situación en la que un proceso solicite un recurso y éste no se encuentre disponible en este momento, en cuyo caso el proceso pasará a un estado de espera.
Tal vez suceda que algunos procesos en espera nunca cambien nuevamente su estado, debido a que los recursos que han solicitado están retenidos por otros procesos también en espera. Esta situación se denomina bloqueo mutuo.
A diferencia de otros problemas de concurrencia de procesos, no existe una solución general para los interbloqueos. Todos los interbloqueos surgen de necesidades que no pueden ser satisfechas, por parte de dos o más procesos.
Como se mencionó anteriormente un sistema consta de un número finito de recursos que se van a distribuir entre los procesos que compiten por ellos. Los recursos están divididos en varios tipos: espacio de memoria, ciclos de CPU, archivos, dispositivos de E/S, etc. Si un sistema tiene dos CPU entonces el recurso del tipo CPU tiene dos instancias, de manera similar el recurso del tipo impresora puede tener cinco instancias.
“Si un proceso solicita una instancia de un tipo de recurso, la asignación de cualquier instancia de dicho tipo deberá satisfacer la solicitud. Si no fuera así, entonces las instancias no son idénticas y las clases de tipos de recursos no han sido definidas correctamente”. Por ejemplo, un sistema puede tener dos impresoras.
Estas dos impresoras pueden definirse para la misma clase de recurso si a nadie le importa qué impresora genera qué salida. Sin embargo, si una impresora está en el noveno piso y la otra en el sótano, entonces las personas del noveno piso tal vez no vean a las dos impresoras como equivalente, y quizá sea necesario definir clases de recursos distintas para cada impresora.
Un proceso debe solicitar un recurso antes de usarlo y liberarlo después de usarlo. Un proceso puede solicitar tantos recursos como requiere para llevar a cabo su tarea asignada. Obviamente, el número de recursos solicitados no puede exceder el número total de recursos disponibles en el sistema.
Es decir, un proceso no puede solicitar tres impresoras si el sistema sólo tiene dos. Si se hace tal solicitud, será rechazada.
En el modo normal de operación, un proceso puede usar un recurso sólo en la siguiente secuencia:
1. Solicitud: si la solicitud no puede ser atendida inmediatamente (porque el recurso está siendo utilizado por otro proceso), entonces el proceso solicitante debe esperar hasta que pueda adquirir el recurso.
2. Uso: el proceso puede operar sobre el recurso (por ejemplo, si el recurso es una impresora, el proceso puede imprimir en ella).
3. Liberación: el proceso libera al recurso.
La solicitud y liberación de recursos son llamadas al sistema. Como ejemplos se tienen las llamadas al sistema request y release device, open y close file, allocate y free memory. La solicitud y liberación de recursos que no son administrados por el sistema operativo pueden realizarse mediante las operaciones P y V en semáforos, o mediante la adquisición y liberación de una cerradura para un objeto Java vía la palabra clave synchronized.
Por cada uso de un recurso administrado por el kernel, por parte de un proceso hilo, el sistema operativo hace una verificación para asegurarse de que el proceso solicitó y se le asignó el recurso. Una tabla del sistema registra si cada recurso está libre o asignado y, para cada recurso asignado, a qué proceso.
Si un proceso solicita un recurso que actualmente está asignado a otro proceso, puede ser agregado a una cola de procesos que están en espera de dicho recurso.
Un conjunto de procesos se encuentra en un estado de bloqueo mutuo cuando cada proceso del conjunto está esperando un evento que sólo puede ser provocado por otro proceso en el conjunto. La característica de los bloqueos mutuos es que los procesos nunca terminan de ejecutarse y los recursos están inmovilizados, lo que impide que otros trabajos puedan iniciar.
El bloqueo mutuo puede surgir si se presentan simultáneamente las siguientes cuatro condiciones en un sistema:
1. Exclusión mutua: al menos un recurso debe estar retenido en un modo no compartido; es decir, solo un proceso a la vez pude usar el recurso. Si otro proceso solicita dicho recurso, el proceso solicitante debe esperar hasta que el recurso haya sido liberado.
2. Retención y espera: debe existir un proceso que esté retenido por lo menos un recurso y esté esperando adquirir recursos adicionales que en ese momento estén siendo retenidos por otros procesos.
3. No apropiación: Los recursos no pueden ser apropiados; es decir, un recurso sólo puede ser liberado voluntariamente por el proceso que lo está reteniendo, una vez que dicho proceso ha completado su tarea.
4. Espera circular: debe existir un conjunto P , P , P P de procesos en
0 1 2 n
espera, tal que P esté esperando un recurso que está retenido por P , P y
0 11
estos esperen por un recurso retenido por P2 ,, Pn 1 espere un recurso
retenido por Pn y Pn este esperando un recurso retenido por P0 .
Existen principalmente tres métodos diferentes para manejar el problema de bloqueos mutuos:
1. Utilizar un protocolo para asegurar que el sistema nunca entrará en un estado de bloqueo mutuo.
2. Permitir que el sistema entre en un estado de bloqueo mutuo y luego hacer una recuperación.
3. Ignorar el problema y pretender que los bloqueos mutuos nunca ocurren en el sistema.
La tercera solución es la que utilizan la mayoría de los sistemas operativos, incluyendo UNIX. Para asegurar que nunca ocurran bloqueos mutuos, el sistema puede usar un esquema de prevención de bloqueos o bien un esquema para evitar bloqueos.
La prevención de bloqueos mutuos es un conjunto de métodos para asegurar que por lo menos una de las condiciones necesarias no se cumpla. Estos métodos previenen los bloqueos mutuos restringiendo la forma en que pueden hacerse las solicitudes de recursos.
La evitación de bloqueos mutuos, por otra parte, requiere que al sistema operativo se le dé por adelantado información adicional relacionada con los recursos que solicitará y usará un proceso durante la vida de éste. Con esta información adicional, el sistema operativo puede decidir en cada solicitud si el proceso debe o no esperar.
Si un sistema no emplea un algoritmo de prevención de bloqueos mutuos ni un algoritmo para evitar bloqueos mutuos, entonces puede presentarse la situación de bloqueo mutuo. En este ambiente, el sistema pude proporcionar un algoritmo que examine el estado del sistema para determinar si ha ocurrido un bloqueo mutuo, y un algoritmo para recuperarse de éste (si efectivamente ha ocurrido).31
Asimismo, si un sistema no asegura que jamás ocurrirá un bloqueo mutuo y tampoco proporciona un mecanismo para detección y recuperación de bloqueos mutuos, entonces el sistema puede llegar a un estado de bloqueo mutuo y ni siquiera tener una forma de reconocer lo que ha ocurrido. En este caso, el bloqueo mutuo no detectado dará por resultado un deterioro del desempeño del sistema, debido a que los procesos que no pueden ejecutarse están reteniendo recursos y porque al solicitar recursos, más y más procesos entran en un estado de bloqueo mutuo. Con el tiempo, el sistema dejará de funcionar y tendrá que reiniciarse manualmente.
No obstante que este método no parece ser una forma viable de manejar el problema de los bloqueos mutuos, se utiliza en algunos sistemas operativos. En muchos sistemas, los bloqueos mutuos ocurren con poca frecuencia (por ejemplo, una vez al año); por esta razón, es más barato utilizar este método que emplear los costosos métodos de prevención, evitación, o detección y recuperación de bloqueos mutuos que deben ser usados constantemente.
Fuente: Apuntes de la materia Sistemas Operativos Multiusuario de la FCA – UNAM