lunes, 1 de octubre de 2012

Práctica 6: Deadlock de Procesos en Java


Introducción

El interbloqueo (deadlock) se puede definir como el bloqueo permanente de un conjunto de procesos que compiten por los recursos del sistema o bien se comunican unos con otros. A diferencia de otros problemas de la gestión concurrente de procesos, no existe una solución eficiente para el caso general.

Todos los interbloqueos suponen necesidades contradictorias de recursos por parte de dos o más procesos.

A veces, los interbloqueos se denominan "abrazo mortal".

El interbloqueo puede definirse formalmente como sigue: Un conjunto de procesos está en interbloqueo si cada proceso del conjunto está esperando un evento que sólo otro proceso del conjunto puede causar. Puesto que todos los procesos están esperando, ninguno de ellos puede causar ninguno de los eventos que podrían despertar a cualquiera de los demás miembros del conjunto, y todos los procesos continúan esperando indefinidamente.

Código en Java Deadlock

Deadlock describe una situación en la que dos o más hilos están bloqueados constantemente, esperando a los demás. He aquí un ejemplo.

Alphonse y Gaston son amigos, y grandes creyentes de la cortesía. Una regla estricta de cortesía es que cuando haces reverencia a un amigo, debes permanecer inclinado hasta que tu amigo tenga la oportunidad de responder la reverencia. Desafortunadamente, esta regla no tiene en cuenta la posibilidad de que dos amigos hagan reverencia el uno al otro al mismo tiempo. Esta aplicación de ejemplo, Deadlock, modela esta posibilidad:

public class Deadlock {
    static class Friend {
        private final String name;
        public Friend(String name) {
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
        public synchronized void bow(Friend bower) {
            System.out.format("%s: %s has bowed to me!%n",
                    this.name, bower.getName());
            bower.bowBack(this);
        }
        public synchronized void bowBack(Friend bower) {
            System.out.format("%s: %s has bowed back to me!%n",
                    this.name, bower.getName());
        }
    }

    public static void main(String[] args) {
        final Friend alphonse = new Friend("Alphonse");
        final Friend gaston = new Friend("Gaston");
        new Thread(new Runnable() {
            public void run() { alphonse.bow(gaston); }
        }).start();
        new Thread(new Runnable() {
            public void run() { gaston.bow(alphonse); }
        }).start();
    }
}

Cuando se ejecuta Deadlock, es muy probable que ambos hilos se bloqueen cuando intenten invocar bowBack. Ningún bloque nunca terminaría porque cada hilo está esperando a que el otro salga.

Ejecución del código


Comentario de los resultados de la ejecución del código

Casi siempre el programa nunca va terminar su ejecución ya que los procesos se quedan "atorados" y no avanzan, aunque puede darse el caso de que los procesos no se bloqueen entre sí y el programa logre terminar su ejecución.

Código en Java Deadlock con nombres


                                                      Ejecución del código con nombres


                        Comentario de los resultados de la ejecución del código con nombres

Ocurre lo mismo que en la primera ejecución del código, los procesos se quedan "atorados" y no avanzan, aunque puede darse el caso de que los procesos no se bloqueen entre sí y el programa logre terminar su ejecución.

Manera en la que se presenta el Deadlock en el programa

1. Cuando entra Alphonse.bow (gaston); Alphonse esta ahora bloqueado debido a la palabra clave “Synchronized".

2. Cuando entra gaston.bow (Alphonse); Gaston está ahora bloqueado.

3. No puede ejecutarse “bower.bow Back(thie); del primer método bow que se llama, porque gaston (bower) es bloqueado.

* Espera a que sea liberado el bloqueo.

4. No puede ejecutarse el bower.bowback(this) del segundo método llamado porque Alphonse(bower) esta bloqueado.

*Espera a que el bloqueo sea liberado.

En pocas palabras ambos hilos esperan el un o por el otro para que sea liberado el bloqueo.





No hay comentarios.:

Publicar un comentario