El abrazo mortal de las computadoras

Entre las computadoras habita un asesino silencioso que ataca sin previo aviso (no es la hipertensión, las computadoras no la sufren, la provocan en nosotros) dejando a su paso un rastro de pantallas azules de errores irrecuperables, pérdida de datos de usuario y en los casos más extremos, sistemas operativos destrozados. Existe desde que las computadoras fueron capaces de ejecutar más de un proceso a la vez.

Este elemento recibe el nombre de bloqueo mutuo (deadlock en inglés), también conocido como abrazo mortal y puede ocurrir cuando varios procesos o hilos de ejecución en un sistema concurrente compiten por recursos. A diferencia de otros problemas de concurrencia de procesos, no existe una solución general para este.

Las computadoras son sistemas con múltiples recursos que pueden ser utilizados por un solo proceso a la vez, entre los que se encuentran: impresoras, unidades de cinta (sí, todavía se usan), registros en las tablas del sistema…. Es por esta razón que los sistemas operativos tienen la habilidad de asignar un recurso a un proceso de manera exclusiva, durante cierto tiempo. Muchas aplicaciones necesitan acceso exclusivo a más de un recurso a la vez, creando las condiciones en la escena del crimen.

Según Andrew S. Tanenmbaun y Herbert Bos, en su libro Sistemas Operativos Modernos, cuarta edición, el bloqueo mutuo ocurre cuando: Dado conjunto de procesos, si cada uno de los miembros en el conjunto espera por un evento que solo otro puede causar. Debido a que todos los procesos se encuentran en espera, ninguno de ellos ocasionará algún evento que pueda despertar al resto.

Deadlock
Tomado de sistemasoperativos142.blogspot.com

La escena del crimen

Para que ocurra un bloqueo mutuo, deben cumplirse ciertas condiciones:

  • Condición de exclusión mutua: cada recurso está asignado a un solo proceso o está disponible.
  • Condición de retención y espera: los procesos a los que se les ha asignado un recurso pueden solicitar otros.
  • Condición de no expropiación: los recursos asignados a un proceso no pueden ser retirados, deben ser liberados expresamente por el proceso que lo retiene.
  • Condición de espera circular: debe existir una lista circular de dos o más procesos, cada uno de los cuales espera por un recurso retenido por el siguiente miembro de la cadena.

Los bloqueos mutuos pueden ser modelados utilizando grafos dirigidos, donde los procesos se representan como círculos y los recursos como cuadrados. Un arco dirigido originado en un recurso y con destino en un proceso, significa que este recurso está asignado al proceso en cuestión. Cuando el arco se origina en un proceso hacia un recurso, significa que ese proceso se encuentra bloqueado en espera del recurso.

Interbloqueo
a) En posesión de un recurso, b) Solicitando un recurso, c) Bloqueo mutuo

En general, se utilizan cuatro estrategias para tratar con el bloqueo mutuo:

  • Ignorar el problema, según Tanenbaum, se utiliza esta estrategia en la esperanza de que si lo ignoras, el te ignorará.
  • Detección y recuperación, dejar que ocurra el problema, detectarlo y tomar acción.
  • Prevención dinámica mediante una cuidadosa asignación de recursos.
  • Prevención, mediante la negación de alguna de las cuatro condiciones necesarias.

En teoría existen diversos algoritmos capaces de prevenir el bloqueo mutuo, como el algoritmo del banquero, tratado ampliamente en la literatura, pero es esencialmente imposible evitarlos. Esto se debe a que los algoritmos requieren información acerca de peticiones futuras que simplemente no es conocida. En la vida real se tratan de atacar las condiciones necesarias, para prevenir que ocurran.

Este fenómeno puede ocurrir no solo en los sistemas operativos, sino también en tuplas de bases de datos y recursos de red.

Gran cuidado se debe tener al solicitar y utilizar los recursos en el sistema operativo, algo tan trivial como utilizar las DLL en Microsoft Windows puede generar un bloqueo mutuo bajo ciertas condiciones.

Comentarios