INTERBLOQUEO
El interbloqueo es una anomalía que puede ocurrir durante la ejecución de procesos concurrentes debido a la competencia por los recursos.
Si bien es cierto que prácticamente ningún sistema operativo real incorpora mecanismos de tratamiento
de interbloqueo, esto es debido a una cuestión de la pérdida de rendimiento que conlleva su tratamiento para la baja probabilidad que hay de que ocurra. En un sistema operativo ideal,
sin embargo, sí deberían incluirse mecanismos para su tratamiento, dado que existen y son bien
conocidos.
El interbloqueo es un problema que afecta a procesos concurrentes que utilizan recursos en un sistema.
Los procesos solicitan recursos al sistema y los liberan cuando ya no los necesitan. Un recurso puede estar disponible o bien asignado a algún proceso.
Ejemplares. Puede haber varios ejemplares de un mismo tipo de recurso (ej. Varias impresoras). En este caso, cuando un proceso solicita un recurso, se le concede cualquiera de los ejemplares que esté disponible.
Si un proceso solicita un recurso que no tiene ejemplares disponibles, el proceso queda bloqueado, esperando hasta que se le asigna un ejemplar.
El problema
Un conjunto de procesos bloqueados, cada uno de ellos esperando por un recurso que retiene otro proceso de ese conjunto.
Ningún proceso del conjunto puede avanzar
Interbloqueo, bloqueo mutuo, abrazo mortal (deadlock).
Condiciones para el interbloqueo
Si en un sistema se produce una situación de interbloqueo, entonces se cumplen simultáneamente estas cuatro condiciones:
Exclusión mutua. Los recursos no se pueden compartir.
Retención y espera. Un proceso que retiene uno o varios recursos se encuentran esperando por recursos asignados a otros procesos.
No expropiación. Un recurso sólo puede ser liberado por el proceso que lo retiene, voluntariamente.
Espera circular. Existe una serie de procesos en espera {Po, P1,...Pn} en la que todo Pi espera por un recurso retenido por Pi+1; y Pn espera por un recurso retenido por
Po.
Tratamiento del interbloqueo
Garantizar que en el sistema nunca ocurren interbloqueos
Prevención: diseñar el sistema de manera que nunca se cumpla alguna de las cuatro condiciones del interbloqueo.
Evitación: tratar de no caer nunca en un estado de interbloqueo.
Permitir la aparición de interbloqueos y recuperarse cuando ocurran necesitamos un sistema de detección y un mecanismo de recuperación
No tratar el problema si hay interbloqueos, el usuario tiene que intervenir
Prevención del interbloqueo
Se trata de eliminar la aparición de alguna de las cuatro condiciones necesarias para el interbloqueo.
Exclusión mutua. Depende de la naturaleza del recurso, así que esta condición no se puede eliminar.
Prevención del interbloqueo
Retención y espera. Hay que garantizar que un proceso no pueda quedar bloqueado si retiene algún recurso. ¿Cómo conseguirlo?
El proceso tiene que pedir todos sus recursos de una vez, p.ej. antes de empezar a ejecutarse efecto negativo: muchos recursos retenidos pero no usados, un proceso sólo puede solicitar recursos cuando no tiene ninguno asignado
Efecto negativo: puede ocurrir que tengamos que liberar un recurso y volver a pedirlo para poder solicitar otros recursos
En ambos caso puede que un proceso nunca se ejecute (inanición)
No expropiación. Permitir que el S.O. desasigne recursos a un proceso bloqueado.
Si un proceso se bloquea por un recurso, los recursos retenidos quedan a disposición de los procesos activos
El proceso bloqueado tiene ahora que esperar por todos los recursos
Penaliza a los procesos que necesitan muchos recursos
Es posible seguir este protocolo en recursos cuyo estado se puede guardar fácilmente y después restaurarse (registros de CPU, espacio de memoria, ...). Generalmente no puede aplicarse a recursos tales como impresoras y unidades de cinta
Espera circular. Se puede evitar forzando un orden en la petición de los recursos.
Cada recurso tiene asignado un número de orden
Los recursos se deben pedir en orden ascendente
Aconsejable: el orden de petición de los recursos se establezca según el orden de uso normal de los recursos de un sistema
Efectos negativos
Se limita la libertad de escritura de código
Se puede inducir a una mala utilización de los recursos
Evitación del interbloqueo:
Algoritmo del banquero
Se trata de conceder los recursos sólo cuando no representen un riesgo futuro de interbloqueo.
Lo procesos han de declarar por anticipado la cantidad máxima de recursos que van a utilizar a lo largo de su vida
Estado seguro: un estado en el cual no hay riesgo inminente de interbloqueo. Un estado es seguro si en él podemos encontrar una secuencia segura con todos los procesos del sistema {P1, P2, ...,PN} es una secuencia segura si los recursos que Pi puede pedir en el peor caso se pueden atender con lo que hay disponible más los recursos poseídos por todos los procesos
Pj,j<i
Sólo concedemos recursos si el estado resultante tras la petición es seguro
¿Qué significa una secuencia segura?
Nos ponemos en el peor caso del sistema: que todos los procesos soliciten al mismo tiempo el máximo de recursos a los que tiene derecho
El primer proceso de la secuencia es uno que podría finalizar en ese peor caso, con los recursos disponibles en el sistema
El segundo proceso es uno que puede finalizar con lo que hay disponible más los recursos que liberaría el primer proceso
De la misma forma, los siguientes procesos pueden finalizar con los recursos que han liberado los anteriores en la secuencia
Y si todos los procesos pueden terminar, es que no hay interbloqueo
Cuando un proceso realiza una petición, el SO calcula si tras conceder los recursos el sistema pasa a un estado seguro
Si el nuevo estado es seguro, se concede la petición
Si el nuevo estado no es seguro, el proceso queda bloqueado (aunque existan recursos suficientes para atender la petición). La petición se concede cuando se observa que no hay riesgo de interbloqueo
Ejemplo
Dos recursos R1 y R2, con 5 y 6 ejemplares
En el instante actual quedan libres 1 y 1 ejemplares
El estado es seguro porque existe la secuencia segura {Pc, Pa,
Pb}
¿Qué pasa si Pa pide un ejemplar de R1 y se lo damos?
El sistema quedará en un estado inseguro
Detección del interbloqueo
El interbloqueo se puede detectar comprobando si existe una secuencia de terminación de procesos (similar al sec. seguro):
- Sea L la lista de procesos del sistema y R el conjunto de recursos disponibles
- Buscar en L un proceso que puede continuar con los recursos disponibles en R
- Si no se encuentra ningún proceso, ir al paso 5
- Suponer que P termina (lo retiramos de L) y que libera los recursos que retiene (los añadimos a R)
- Volver al paso 1
- Si L no está vacía, hay interbloqueo
Recuperación del interbloqueo
Un sistema que pretenda recuperarse del interbloqueo, debe invocar a un algoritmo de detección cuando lo considere oportuno (ej. periódicamente)
- Formas de intentar la recuperación:
- Terminación de procesos
- Expropiación de recursos
Terminación de procesos
- matando a todos los procesos implicados (drástico)
- matando a uno de los procesos ¿cuál?
- el que más recursos libere
- el que menos tiempo lleve en ejecución...
- retrocediendo la ejecución de algún proceso ( rollback)
- muy complicado de implementar y necesita que el programa esté diseñado para que pueda retroceder
- Expropiación de recursos
- Selección de la víctima
¿Qué recursos y de que procesos se expropian?
Retroceso
Si expropiamos un recurso de un proceso, ¿qué hacemos con ese proceso?
En ambos casos (terminación de procesos o expropiación de recursos) hay que tener cuidado de no provocar la inanición de procesos