1. El algoritmo de la avestruz: Aunque nuestro análisis de los gráficos de recursos ha sido para el caso de un solo recurso de cada tipo, los gráficos de recursos también se pueden generalizar para manejar varios recursos del mismo tipo (Holt, 1972). En general, se utilizan cuatro estrategias para lidiar con los interbloqueos
1.1. El algoritmo de la avestruz
1.1.1. 1. Sólo ignorar el problema. Tal vez si usted lo ignora, él lo ignorará a usted.
1.1.2. 2. Detección y recuperación. Dejar que ocurran los interbloqueos, detectarlos y tomar acción.
1.1.3. 3. Evitarlos en forma dinámica mediante la asignación cuidadosa de los recursos.
1.1.4. 4. Prevención, al evitar estructuralmente una de las cuatro condiciones requeridas
1.2. Como funciona:
1.2.1. El método más simple es el algoritmo de la avestruz: meta su cabeza en la arena y pretenda que no hay ningún problema.
2. Introducción a los interbloqueos: El interbloqueo se puede definir formalmente de la siguiente manera: Un conjunto de procesos se encuentra en un interbloqueo si cada proceso en el conjunto está esperando un evento que sólo puede ser ocasionado por otro proceso en el conjunto.
2.1. Condiciones para los interbloqueos de recursos
2.1.1. 1. Condición de exclusión mutua. Cada recurso se asigna en un momento dado a sólo un proceso, o está disponible.
2.1.2. 2. Condición de contención y espera. Los procesos que actualmente contienen recursos que seles otorgaron antes pueden solicitar nuevos recursos.
2.1.3. 3. Condición no apropiativa. Los recursos otorgados previamente no se pueden quitar a un proceso por la fuerza. Deben ser liberados de manera explícita por el proceso que los contiene.
2.1.4. 4. Condición de espera circular. Debe haber una cadena circular de dos o más procesos, cadauno de los cuales espera un recurso contenido por el siguiente miembro de la cadena.
2.2. Modelado de interbloqueos
2.2.1. Holt (1972) mostró cómo se pueden modelar estas cuatro condiciones mediante el uso de gráficos dirigidos. Los gráficos tienen dos tipos de nodos: procesos, que se muestran como círculos, y recursos, que se muestran como cuadros.
2.2.2. Un arco dirigido de un nodo de recurso (cuadro) a un nodo de proceso (círculo) significa que el recurso fue solicitado previamente por, y asignado a, y actualmente es contenido por ese proceso.
3. Recursos: Los interbloqueos pueden ocurrir cuando a los procesos se les otorga acceso exclusivo a los dispositivos, registros de datos, archivos
3.1. Recursos apropiativos y no apropiativos
3.1.1. Un recurso apropiativo es uno que se puede quitar al proceso que lo posee sin efectos dañinos.
3.1.2. La memoria es un ejemplo de un recurso apropiativo
3.1.3. La secuencia de eventos requerida para utilizar un recurso se proporciona a continuación, en un formato abstracto.
3.1.4. 1. Solicitar el recurso.
3.1.5. 2. Utilizar el recurso.
3.1.6. 3. Liberar el recurso
3.2. Adquisición de recursos
3.2.1. Para ciertos tipos de recursos, como los registros de una base de datos, es responsabilidad de los procesos de usuario administrar su uso.
3.2.2. Una manera de permitir que los usuarios administren los recursos es asociar un semáforo con cada recurso.
4. Deteccion y recuperacion de un interbloqueo: Una segunda técnica es la detección y recuperación. Cuando se utiliza esta técnica, el sistema no trata de evitar los interbloqueos. En vez de ello, intenta detectarlos cuando ocurran y luego realiza cierta acción para recuperarse después del hecho.
4.1. Detección de interbloqueos con un recurso de cada tipo
4.1.1. Vamos a empezar con el caso más simple: sólo existe un recurso de cada tipo. Dicho sistema podría tener un escáner, un grabador de CD, un trazador (plotter) y una unidad de cinta, pero no más que un recurso de cada clase.
4.2. Detección del interbloqueo con varios recursos de cada tipo
4.2.1. Cuando existen varias copias de algunos de los recursos, se necesita un método distinto para detectar interbloqueos
4.3. Recuperación de un interbloqueo
4.3.1. Suponga que nuestro algoritmo de detección de interbloqueos ha tenido éxito y detectó un interbloqueo. ¿Qué debemos hacer ahora? Se necesita alguna forma de recuperarse y hacer funcionar el sistema otra vez. En esta sección analizaremos varias formas de recuperarse de un interbloqueo. Sin embargo, ninguna de ellas es en especial atractiva
4.3.1.1. Recuperación por medio de apropiación
4.3.1.2. En algunos casos puede ser posible quitar temporalmente un recurso a su propietario actual y otorgarlo a otro proceso. En muchos casos se puede requerir intervención manual, en especial en los sistemas operativos de procesamiento por lotes que se ejecutan en mainframes.
4.3.1.3. Recuperación a través del retroceso
4.3.1.4. Si los diseñadores de sistemas y operadores de máquinas saben que es probable que haya interbloqueos, pueden hacer que los procesos realicen puntos de comprobación en forma periódica. Realizar puntos de comprobación en un proceso significa que su estado se escribe en un archivo para poder reiniciarlo más tarde.
4.3.1.5. Recuperación a través de la eliminación de procesos
4.3.1.6. La forma más cruda y simple de romper un interbloqueo es eliminar uno o más procesos. Una posibilidad es eliminar a uno de los procesos en el ciclo. Con un poco de suerte, los demás procesos podrán continuar. Si esto no ayuda, se puede repetir hasta que se rompa el ciclo.
4.3.1.7. De manera alternativa, se puede elegir como víctima a un proceso que no esté en el ciclo, para poder liberar sus recursos.
5. Como evitar los interbloqueos
5.1. Trayectorias de los recursos
5.2. Los principales algoritmos para evitar interbloqueos se basan en el concepto de los estados seguros. Antes de describir los algoritmos, haremos una ligera digresión para analizar el concepto de la seguridad, en una forma gráfica y fácil de comprender
5.3. El algoritmo del banquero para un solo recurso
5.4. Dijkstra (1965) ideó un algoritmo de programación que puede evitar interbloqueos; este algoritmo se conoce como el algoritmo del banquero y es una extensión del algoritmo de detección de interbloqueos
5.5. El algoritmo del banquero para varios recursos
5.5.1. Ahora se puede declarar el algoritmo para comprobar si un estado es seguro.
5.5.2. 1. Buscar una fila R, cuyas necesidades de recursos no satisfechas sean menores o iguales que A. Si no existe dicha fila, el sistema entrará en interbloqueo en un momento dado, debido a que ningún proceso se podrá ejecutar hasta completarse (suponiendo que los procesos mantienen todos los recursos hasta que terminan).
5.5.3. 2. Suponer que el proceso seleccionado de la fila solicita todos los recursos que necesita (loque se garantiza que es posible) y termina. Marcar ese proceso como terminado y agregar todos sus recursos al vector A.
5.5.4. 3. Repetir los pasos 1 y 2 hasta que todos los procesos se marquen como terminados (en cuyocaso el estado inicial era seguro) o hasta que no haya ningún proceso cuyas necesidades de recursos se puedan satisfacer (en cuyo caso hay un interbloqueo).