UNIDAD 6 – INTERBLOQUEOS Los sistemas computacionales están llenos de recursos que pueden ser utilizados por sólo un proceso a la vez. Si dos procesos utilizan la misma entrada en la tabla del sistema de archivos invariablemente se corrompe el sistema de archivos. En consecuencia, todos los sistemas operativos tienen la habilidad de otorgar (en forma temporal) a un proceso el acceso exclusivo a ciertos recursos Se denomina INTERBLOQUEO a la situación donde dos o más procesos están bloqueados y van a permanecer así para siempre. 6.1 RECURSOS Los interbloqueos pueden ocurrir cuando a los procesos se les otorga acceso exclusivo a los recursos. Un recurso es cualquier cosa que se debe adquirir, utilizar y liberar con el transcurso del tiempo. 6.1.1 Recursos apropiativos y no apropiativos Los recursos pueden ser de dos tipos: ▪ Un recurso apropiativo es uno que se puede quitar al proceso que lo posee sin efectos dañinos. ▪ Por el contrario, un recurso no apropiativo es uno que no se puede quitar a su propietario actual sin hacer que el cómputo falle. En general, los interbloqueos involucran a los recursos no apropiativos. Los interbloqueos potenciales que pueden involucrar a los recursos apropiativos por lo general se pueden resolver mediante la reasignación de los recursos de un proceso a otro. La secuencia de eventos requerida para utilizar un recurso 1. Solicitar el recurso. 2. Utilizar el recurso. 3. Liberar el recurso. Un proceso al que se le ha negado la petición de un recurso por lo general permanece en un ciclo estrecho solicitando el recurso, después pasa al estado inactivo y después intenta de nuevo. Aunque este proceso no está bloqueado, para toda intención y propósito es como si lo estuviera, debido a que no puede realizar ningún trabajo útil. 6.1.2 Adquisición de recursos Para ciertos tipos de recursos, como los registros de una base de datos, es responsabilidad de los procesos de usuario administrar su uso. Una manera de permitir que los usuarios administren los recursos es asociar un semáforo con cada recurso. Si quieren obtener dos o más recursos, los obtendrán de manera secuencial. Aquí podemos ver cómo lo que parece ser una diferencia insignificante en el estilo de codificación (cuál recurso adquirir primero) constituye la diferencia entre un programa funcional y uno que falle de una manera difícil de detectar 6.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. Generalmente, el evento por el que cada proceso espera es la liberación de algún recurso que actualmente es poseído por otro miembro del conjunto, A este tipo de interbloqueo se le conoce como interbloqueo de recursos. 6.2.1 Condiciones para los interbloqueos de recursos Deben aplicarse cuatro condiciones para un interbloqueo (de recursos), si una esta ausente, no es un interbloqueo: 1. Condición de exclusión mutua. Cada recurso se asigna en un momento dado a sólo un proceso, o está disponible. 2. Condición de contención y espera. Los procesos que actualmente contienen recursos que se les otorgaron antes pueden solicitar nuevos recursos. 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. 4. Condición de espera circular. Debe haber una cadena circular de dos o más procesos, cada uno de los cuales espera un recurso contenido por el siguiente miembro de la cadena. 6.2.2 Modelado de interbloqueos Se pueden modelar mediante 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. 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. Un arco dirigido de un proceso a un recurso significa que el proceso está actualmente bloqueado, en espera de ese recurso. En general, se utilizan cuatro estrategias para lidiar con los interbloqueos. 1. Sólo ignorar el problema. Tal vez si usted lo ignora, él lo ignorará a usted. 2. Detección y recuperación. Dejar que ocurran los interbloqueos, detectarlos y tomar acción. 3. Evitarlos en forma dinámica mediante la asignación cuidadosa de los recursos. 4. Prevención, al evitar estructuralmente una de las cuatro condiciones requeridas. 6.3 EL ALGORITMO DE LA AVESTRUZ Si hay un interbloqueo, no hacer nada, ignorarlo. 6.4 DETECCIÓN Y RECUPERACIÓN DE UN INTERBLOQUEO 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. 6.4.1 Detección de interbloqueos con un recurso de cada tipo El algoritmo opera al llevar a cabo los siguientes pasos, según lo especificado: 1. Para cada nodo N en el gráfico, realizar los siguientes cinco pasos con N como el nodo inicial. 2. Inicializar L con la lista vacía y designar todos los arcos como desmarcados, siendo L una lista de nodos, así como la lista de arcos. 3. Agregar el nodo actual al final de L y comprobar si el nodo ahora aparece dos veces en L. Si lo hace, el gráfico contiene un ciclo (listado en L) y el algoritmo termina. 4. Del nodo dado, ver si hay arcos salientes desmarcados. De ser así, ir al paso 5; en caso contrario, ir al paso 6. 5. Elegir un arco saliente desmarcado al azar y marcarlo. Después seguirlo hasta el nuevo nodo actual e ir al paso 3. 6. Si este nodo es el inicial, el gráfico no contiene ciclos y el algoritmo termina. En caso contrario, ahora hemos llegado a un punto muerto. Eliminarlo y regresar al nodo anterior; es decir, el que estaba justo antes de éste, hacerlo el nodo actual e ir al paso 3. Si alguna vez regresa a un nodo que ya se haya encontrado, entonces ha encontrado un ciclo. Pero, si esta propiedad se aplica para todos los nodos, el gráfico completo está libre de ciclos, por lo que el sistema no está en interbloqueo. 6.4.2 Detección del interbloqueo con varios recursos de cada tipo Este algoritmo basado en matrices se utiliza para detectar interbloqueos entre n procesos, de P1 a Pn. Hagamos que el número de clases de recursos sea m, con E1 recursos de la clase 1, E2 recursos de la clase 2 y en general, Ei recursos de la clase i (1 ≤ i ≤ m). E es el vector de recursos existentes. Este vector proporciona el número total de instancias de cada recurso en existencia. Algunos de los recursos están asignados y no están disponibles. Hagamos que A sea el vector de recursos disponibles, donde Ai proporciona el número de instancias del recurso i que están disponibles en un momento dado (es decir, sin asignar). Ahora necesitamos dos arreglos: C, la matriz de asignaciones actuales y R, la matriz de peticiones. La i-ésima fila de C nos indica cuántas instancias de cada clase de recurso contiene Pi en un momento dado. Así Cij es el número de instancias del recurso j que están contenidas por el proceso i. De manera similar, Rij es el número de instancias del recurso j que desea Pi El algoritmo de detección de interbloqueos se muestra a continuación. 1. Buscar un proceso desmarcado, Pi, para el que la i-ésima fila de R sea menor o igual que A. 2. Si se encuentra dicho proceso, agregar la i-ésima fila de C a A, marcar el proceso y regresar al paso 1. 3. Si no existe dicho proceso, el algoritmo termina. Cuando el algoritmo termina, todos los procesos desmarcados (si los hay) están en interbloqueo. 6.4.3 Recuperación de un interbloqueo Recuperación por medio de apropiación 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. Recuperación a través del retroceso 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, los cuales contienen la imagen de la memoria, sino también el estado del recurso Recuperación a través de la eliminación de procesos. 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. 6.5 CÓMO EVITAR INTERBLOQUEOS El sistema debe ser capaz de decidir si es seguro otorgar un recurso o si no lo es, y realizar la asignación sólo cuando sea seguro. Un interbloqueo puede ser evitado solo si conocemos cierta información de antemano. 6.5.1 Trayectorias de los recursos Cada punto en el diagrama representa un estado conjunto de los dos procesos. Las regiones sombreadas son en especial interesantes. La región con las líneas que se inclinan de suroeste a noreste representa cuando ambos procesos tienen la impresora. La regla de exclusión mutua hace imposible entrar a esta región. 6.5.2 Estados seguros e inseguros Un estado es seguro si hay cierto orden de programación en el que se puede ejecutar cada proceso hasta completarse, incluso aunque todos ellos solicitaran de manera repentina su número máximo de recursos de inmediato. Mediante una programación cuidadosa, se puede evitar el interbloqueo. Un estado es inseguro si no hay una secuencia que garantice que los procesos se completarán 6.5.3 El algoritmo del banquero para un solo recurso Es un algoritmo de programación para evitar interbloqueos. Se modela de la forma en que un banquero de una pequeña ciudad podría tratar con un grupo de clientes a los que ha otorgado líneas de crédito. Lo que hace el algoritmo es comprobar a medida que va ocurriendo si al otorgar la petición se produce un estado inseguro. Si es así, la petición se rechaza. Si al otorgar la petición se produce un estado seguro, se lleva a cabo. 6.5.4 El algoritmo del banquero para varios recursos Se muestran los recursos existentes (E), los recursos poseídos (P) y los recursos disponibles (A), respectivamente. Ahora se puede declarar el algoritmo para comprobar si un estado es seguro. 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. 2. Suponer que el proceso seleccionado de la fila solicita todos los recursos que necesita y termina. Marcar ese proceso como terminado y agregar todos sus recursos al vector A. 3. Repetir los pasos 1 y 2 hasta que todos los procesos se marquen como terminados (en cuyo caso 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). Si hay varios procesos que pueden elegirse en el paso 1, no importa cuál esté seleccionado: la reserva de recursos disponibles aumentará, o en el peor caso, permanecerá igual. 6.6 CÓMO PREVENIR INTERBLOQUEOS 6.6.1 Cómo atacar la condición de exclusión mutua Si ningún recurso se asignara de manera exclusiva a un solo proceso, nunca tendríamos interbloqueos, por lo tanto, la solución es evite asignar un recurso cuando no sea absolutamente necesario, y trate de asegurarse que la menor cantidad posible de procesos reclamen ese recurso. 6.6.2 Cómo atacar la condición de contención y espera Si podemos evitar que los procesos que contienen recursos esperen por más recursos, podemos eliminar los interbloqueos. Una forma de lograr esta meta es requerir que todos los procesos soliciten todos sus recursos antes de empezar su ejecución. Si todo está disponible, al proceso se le asignará lo que necesite y podrá ejecutarse hasta completarse. Si uno o más recursos están ocupados, no se asignará nada y el proceso sólo esperará. El problema es que muchos procesos no saben cuántos recursos necesitarán hasta que hayan empezado a ejecutarse. Una manera ligeramente distinta de romper la condición de contención y espera es requerir que un proceso que solicita un recurso libere temporalmente todos los recursos que contiene en un momento dado. Después puede tratar de obtener todo lo que necesite a la vez. 6.6.3 Cómo atacar la condición no apropiativa Si a un proceso se le ha asignado la impresora y está a la mitad de imprimir su salida, quitarle la impresora a la fuerza debido a que el trazador que necesita no está disponible es algo engañoso como máximo, e imposible en el peor caso. Sin embargo, ciertos recursos se pueden virtualizar para evitar esta situación 6.6.4 Cómo atacar la condición de espera circular Esto se puede solucionar de varias formas, una de ellas es tener una regla que establezca un proceso tiene derecho sólo a un recurso en cualquier momento. Si necesita un segundo recurso, debe liberar el primero. Otra manera de evitar la espera circular es proporcionar una numeración global de todos los recursos, y todas las peticiones se deben realizar en orden numérico. 6.7 OTRAS CUESTIONES 6.7.1 Bloqueo de dos fases Una operación que ocurre con frecuencia es solicitar bloqueos sobre varios registros y después actualizar todos los registros bloqueados. A este método se le conoce como bloqueo de dos fases, el proceso trata de bloquear todos los registros que necesita, uno a la vez. Si tiene éxito pasa a la segunda fase, realizando sus actualizaciones y liberando los bloqueos. 6.7.2 Interbloqueos de comunicaciones Un arreglo común es que el proceso A envía un mensaje de petición al proceso B, y después se bloquea hasta que B envía de vuelta un mensaje de respuesta. Suponga que el mensaje de petición se pierde. A se bloquea en espera de la respuesta. B se bloquea en espera de una petición para que haga algo. Tenemos un interbloqueo. Sólo que éste no es el clásico interbloqueo de recursos. A no está en posesión de un recurso que B quiere, ni viceversa. De hecho, no hay recursos a la vista. Pero es un interbloqueo de acuerdo con nuestra definición formal, ya que tenemos un conjunto de (dos) procesos, cada uno bloqueado en espera de un evento que sólo el otro puede provocar. A esta situación se le conoce como interbloqueo de comunicación Los interbloqueos de comunicación no se pueden evitar mediante el ordenamiento de recursos (ya que no hay ninguno), ni se puede evitar mediante una programación cuidadosa (ya que no hay momentos en los que se puede posponer una petición). Por fortuna hay otra técnica que por lo general se puede utilizar para romper los interbloqueos de comunicación: los tiempos de espera. 6.7.3 Bloqueo activo En ciertas situaciones se utiliza el sondeo (ocupado en espera).Hay dos procesos los cuales Cada uno necesita dos recursos y ambos utilizan la primitiva de sondeo entrar_region para tratar de adquirir los bloqueos necesarios. Si falla el intento, el proceso sólo intenta otra vez. Si el proceso A se ejecuta primero y adquiere el recurso 1, y después se ejecuta el proceso 2 y adquiere el recurso 2, sin importar quién se ejecute a continuación, no progresará más, pero ninguno de los procesos se bloqueará. Sólo utiliza su quantum de CPU una y otra vez sin progresar, pero sin bloquearse tampoco. Por ende, no tenemos un interbloqueo (debido a que ningún proceso está bloqueado), pero tenemos algo funcionalmente equivalente al interbloqueo: el bloqueo activo (livelock) 6.7.4 Inanición En un sistema dinámico, las peticiones de recursos ocurren todo el tiempo. Se necesita cierta política para decidir acerca de quién obtiene qué recurso y cuándo. Esta política, aunque parece razonable, puede ocasionar que ciertos procesos nunca reciban atención, aun cuando no estén en interbloqueo.
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )