miércoles, 28 de noviembre de 2012

2.4.3.1 Prevención.


            En las estrategias de prevención de dead Locks, los recursos son otorgados a los procesos solicitados, de tal manera que la solicitud de un recurso nunca llega a un Dead Lock.  Esta estrategia se cerciora de que cuando menos una de cuatro condiciones de Dead Lock nunca llegue a ocurrir.

* Exclusión mutua.
            La condición de exclusión mutua debe conservarse para recursos no compartibles. Los recursos compartibles, no requieren acceso mutuamente excluyente y, por tanto, no pueden participar en un dead lock. Los archivos de  sólo lectura son un buen ejemplo de recursos compartibles. Si varios procesos tratan de abrir  al mismo tiempo un archivo de sólo lectura, se les puede otorgar accesos simultáneos al archivo, por lo general no es posible evitar dead lock`s  negando la condición de exclusión mutua. Por su naturaleza algunos recursos no pueden compartirse.   


* Negación de la condición de "espera por".

            La primera estrategia de Havender requiere que todos los recursos que va a necesitar un proceso sean pedidos de una sola vez. El sistema deberá asignarlos según el principio "todo o nada". Si el conjunto de recursos que necesita un proceso está disponible se le asigna (todo) y se le permite entrar en ejecución. Si no es así, el proceso deberá esperar hasta que su conjunto de recursos esté disponible. Mientras un proceso espera. No podrá tener ningún recurso.


Esta estrategia presenta las siguientes desventajas:

*          Puede llevar a la postergación indefinida, ya que quizá todos los recursos   requeridos estén disponibles al mismo tiempo (costos de operación altos).

*          Puede llevar  un serio desperdicio de recursos, se requiere tener una gran cantidad de  recursos para poder responder a cumplir petición.

*          Es ineficiente por que decrementa la concurrencia del sistema.
Una variante consiste en dividir el programa en bloques que puedan ser ejecutados con relativa independencia uno del otro. Esto reduce el desperdicio, pero implica un trabajo extra en el diseño de las aplicaciones.

* Negación de la condición de "no apropiatividad".
            Cuando un sistema cuenta con los recursos suficientes para que los procesos puedan funcionar sin problemas (bloqueos). Cuando el sistema permite compartir los recursos y los procesos mantienen  los que otros necesitan sucede un dead lock.
            La segunda estrategia sugiere que cuando a un proceso que mantiene recursos se le niegue una petición de recursos adicionales deberá liberar sus recursos y, si es necesario, pedirlos de nuevo, junto con los adicionales.

            Al retirar los recursos a un proceso que no puede avanzar se niega la condición de "no apropiatividad".  Un problema de esta política es la postergación indefinida.

* Negación de la condición de "espera circular".
            Si se da a los recursos una manera exclusiva y se obliga a los procesos a pedirlos en forma  ascendente es imposible que ocurra una espera circular. Esta propuesta considera:

+          Los recursos deben ser numerados reflejando el orden en el cual la mayoría de los trabajos los usan.
+          Los procesos deben pedir los recursos en forma ascendente.
+          Para los procesos que requieren de los recursos en un orden diferente, los recursos deberán ser tomados y retenidos mucho antes de su utilización. (Implica el desperdicio de los recursos mantenidos pero no usados).

  Ordenamiento lineal  del recurso.
El ordenamiento lineal elimina la posibilidad de la espera circular, pero, obliga al diseñador a trabajar más con sus códigos. Además, los números de recursos son asignados por la instalación y hay que vivir con ellos durante largos periodos (meses o años). Si  los  números  cambian  se tienen  que rescribir los programas y los sistemas existentes.

            La forma  más simple de prevenir un  Dead Lock  es obteniendo todos los recursos necesarios antes que el proceso continué y así se elimine la  "condición de espera".

            En otro método de prevención de dead lock, un proceso bloqueado devuelve los recursos solicitados por un proceso activo, al igual que elimina la condición de "no apropiatividad"

Rosenkrantz  et al.  Ha propuesto la siguiente optimización de este método. Todos los procesos son asignados a prioridades únicas que pueden ser totalmente ordenadas. Un proceso de retención cede el derecho de prioridad a otro proceso que sostiene el recurso necesario solo si el proceso de retención tiene el recurso necesario solo si el proceso de retención tiene mayor prioridad.
            Este método reduce los derechos de prioridad  al 50% al igual que previene los dead locks. En el ordenamiento de Havender's todos los recursos son ordenados de manera única y todos los procesos solicitan los recursos de manera ascendente.
            Únicamente eliminando la condición de "espera circular". Si un proceso ya sostiene algunos recursos, entonces puede pedir solo aquellos acomodos en un rango superior en el orden. Obteniendo recursos, de ésta forma, previene la formación de un ciclo o de un "knot".


Prevenir

Se puede prevenir el bloqueo siempre y cuando se consiga que alguna de las condiciones necesarias para la existencia de un bloqueo no se produzca.
  1. los procesos tienen que compartir recursos con exclusión mutua:
    • No se de a un proceso directamente acceso exclusivo al recurso, si no se usa otro proceso que realiza el trabajo de todos los demás manejando una cola de tareas (por ejemplo, un demonio para imprimir con su cola de documentos por imprimir).
  2. los procesos quieren acceder a un recurso más mientras ya tienen acceso exclusivo a otro:
    • Se exige que un proceso pida todos los recursos que va a utilizar al comienzo de su trabajo
  3. los recursos no permiten ser usados por más de un proceso al mismo tiempo:
    • Se permite que un proceso aborte a otro proceso con el fin de obtener acceso exclusivo al recurso. Hay que tener cuidado de no caer en livelock
  4. existe una cadena circular entre peticiones de procesos y alocación de recursos:
    • Se ordenan los recursos línealmente y se fuerza a los procesos que accedan a los recursos en el orden impuesto. Así es imposible que se produzca un ciclo.
En las prácticas aplicamos dicho método para prevenir bloqueos en la lista concurrente.


Prevención de Deadlocks
La estrategia consiste en anular alguna de las cuatro condiciones necesarias para que se produzca un Deadlock.
  1. No puede ser anulada porque existen recursos que deben ser usados en modalidad exclusiva.
  2. La alternativa sería hacer que todos los procesos solicitaran todos los recursos que habrán de utilizar antes de utilizarlos al momento de su ejecución lo cual sería muy ineficiente.
  3. Para anular esta condición cuando un proceso solicita un recurso y este es negado el proceso deberá liberar sus recursos y solicitarlos nuevamente con los recursos adicionales. El problema es que hay recursos que no pueden ser interrumpidos.
  4. Espera Circular: esta estrategia consiste en que el sistema operativo numere en forma exclusiva los recursos y obligue a los procesos a solicitar recursos en forma ascendente. El problema de esto es que quita posibilidades a la aplicación.

Prevención de deadlock

  • ¶ Deadlock no puede occurir a menos que tenemos todas las cuatro condiciones. Si aseguramos que no puede occurir por lo menos una de las condiciones, no podemos tener deadlock.
  • Exclusión mutua. En general, no podemos eliminar esta condición. Hay recursos como impresoras que no son compartibles.
  • Retención y espera. Para no occurir esta condición, cuando un proceso solicita recursos, no puede retener otros. Protocolos:
    • Un proceso puede solicitar recursos solamente si no tiene ningunos.
    • Un proceso tiene que solicitar todos los recursos antes de la ejecución.
¶ Problemas:
    • La utilización de recursos puede ser baja.
    • Starvation (bloqueo indefinido) si se necesitan algunos recursos populares.
  • No apropiación. Si un proceso retiene varios recursos y solicita otro que no está disponible, se le expropian todos los recursos que retiene. El proceso tiene que recuperar todos los recursos antes de ejecutar otra vez.
Pero en general no podemos exproprian recursos como impresoras y grabadores.
  • Espera circular. Hacemos una ordenación de los tipos de recursos en el sistema (R1, R2, ...). Un proceso tiene que solicitar sus recursos en orden (y todos los ejemplares de un tipo al mismo tiempo). Si necesita un tipo de recurso más baja en la ordenación, tiene que liberar los otros que retiene.
  • Problemas con la prevención de deadlock: Utilización baja de recursos y reducción de la productividad del sistema.

Evitar

El sistema no da permiso de acceso a recursos si es posible que el proceso se bloquee en el futuro. Un método es el algoritmo del banquero (Dijkstra) que es un algoritmo centralizado y por eso posiblemente no muy practicable en muchas situaciones.
Se garantiza que todos los procesos actuan de la siguiente manera en dos fases:
  1. primero se obtiene todos los cerrojos necesarios para realizar una tarea, eso se realiza solamente si se puede obtener todos a la vez,
  2. despues se realiza la tarea durante la cual posiblemente se liberan recursos que no son necesarias.
Ejemplo:
Asumimos que tengamos 3 procesos que actuan con varios recursos. El sistema dispone de 12 recursos.
proceso
recursos pedidos
recursos reservados
A
4
1
B
6
4
C
8
5
suma
18
10
es decir, de los 12 recursos disponibles ya 10 están ocupados. La única forma que se puede proceder es dar el acceso a los restantes 2 recursos al proceso B. Cuando B haya terminado va a liberar sus 6 recursos que incluso pueden estar distribuidos entre A y C, así que ambos también pueden realizar su trabajo.
Con un argumento de inducción se verifica fácilmente que nunca se llega a ningún bloqueo.


Evitación.

            Un método para evitar los Dead Lock`s consiste en requerir información adicional sobre cómo se solicitarán los recursos. Por ejemplo en un sistema con una unidad de cinta y una impresora, podríamos saber que el proceso P solicitará primero la unidad de cinta y luego la impresora, antes de liberar ambos recursos. El proceso Q, por otra parte, solicitará primero la impresora y después la unidad de cinta. Con este conocimiento de la secuencia completa de la solicitud y liberación para cada proceso para cada solicitud requiere que el sistema considera los recursos disponibles en ese momento, los actualmente asignados a cada proceso y las futuras solicitudes y liberaciones de cada proceso para decidir si puede satisfacer la solicitud presente o debe esperar para evitar un posible dead lock futuro.
Los diversos algoritmos difieren en la cantidad y tipo de información que requieren. 

El modelo más sencillo y útil requiere que cada proceso declare el número máximo de recursos de cada tipo que puede necesitar. Con información a priori para cada proceso es posible construir un algoritmo que asegure que el sistema nunca entrará en estado de dead lock. Este algoritmo define la estrategia de evitación de dead lock`s.

            El estado de asignación de recursos viene definido por el número de recursos disponibles  y asignados, y por la demanda máxima de los procesos. Un estado es seguro si el sistema puede asignar recursos a cada proceso (hasta el máximo) siguiendo algún orden u aun así evitar el dead lock.
            Más formalmente, un sistema se encuentra en estado seguro sólo si existe una secuencia segura. Si no existe esta secuencia, se dice que el estado del sistema es inseguro.

            Un estado seguro no es un estado de dead lock, y un estado de dead lock es un estado inseguro; pero no todos los estados inseguros son dead lock`s.


No hay comentarios:

Publicar un comentario