REPORTE DE ALGORITMOS (PETERSON DEKKER, JARDINES Y ESQUIMALES)
Benemrita Universidad Autnoma de Puebla
Facultad de Ciencias de la Computacin Programacin Concurrente y Paralela Ma. Carmen Cern Garnica
Alumnos: Yimi Molina Heredia. Lidia Hernndez Andrade. Ricardo Contreras Cervantes. Cesar Eduardo Guerra Gonzlez.
OBJETIVO: Analizar el problema de exclusin mutua de procesos en sistemas con memoria en comn de procesos ejecutndose concurrentemente para acceder a un mismo recurso compartido.
******Cdigo fuente Peterson******
Este algoritmo es un medio para conseguir la exclusin mutua generalizada para N procesos, que utiliza variables comunes a los procesos concurrentes que solo pueden tomar un numero acotado de valores.
//archivo del algoritmo de Peterson
class ComunPeterson { int procesofavorecido = 1; boolean P1deseaEntrar =false; boolean P2deseaEntrar =false;
Lista I = new Lista(); }
class PetersonP1 extends Thread { ComunPeterson cp;
public PetersonP1(ComunPeterson cp) { this.cp =cp; cp.I.insertarDato(new Integer(0)); REPORTE DE ALGORITMOS (PETERSON DEKKER, JARDINES Y ESQUIMALES) }
public void run() { int i=0; int j=0;
while(j<21) { cp.P1deseaEntrar=true; try{ sleep(400); } catch(Exception e){} while((cp.P2deseaEntrar)&&(cp.procesofavorecido==1)) { cp.I.insertarDato(new Integer(i+1)); System.out.println("\nEl algoritmo de Peterson inserto el #"+(i));
System.out.println("\n\t\tAlgoritmo de PETERSON\n");
p1.start(); p2.start(); } }
REPORTE DE ALGORITMOS (PETERSON DEKKER, JARDINES Y ESQUIMALES) CORRIDA
*****Cdigo fuente Dekker***** Este algoritmo es una combinacin de los intentos que Dr. Dekker realizo, haciendo una combinacin del primero y el cuarto intento; en donde las variables individuales de los procesos permiten conseguir la exclusin mutua, pero se usa una variable de turno comn para ambos proceso.
//Archivo del algoritmo de Dekker
class ComunDekker { int favorecido; boolean p1quiereEntrar, p2quiereEntrar;
int noLineas; }
class P2Dekker extends Thread { ComunDekker cd; int i; public P2Dekker(ComunDekker cd, int i) { REPORTE DE ALGORITMOS (PETERSON DEKKER, JARDINES Y ESQUIMALES) this.cd = cd; this.i = i; }
public void run() { int j=0; while(j<15) { cd.p2quiereEntrar = true; while(cd.p1quiereEntrar) { cd.p2quiereEntrar = false; while (cd.favorecido == 1); cd.p2quiereEntrar = true; } if(cd.favorecido==2) { System.out.println("PROCESO DEKKER2 GENERO EL #"+(cd.noLineas+1)); cd.noLineas++; } cd.favorecido =1; cd.p2quiereEntrar = false; j++; } } }
class P1Dekker extends Thread { ComunDekker cd; int i;
public P1Dekker(ComunDekker cd, int i) { this.cd = cd; this.i = i; } public void run() { int j=0; while(j<15) { cd.p1quiereEntrar = true; while(cd.p2quiereEntrar) { cd.p1quiereEntrar = false; while (cd.favorecido == 2); cd.p1quiereEntrar = true; } if(cd.favorecido==1) { REPORTE DE ALGORITMOS (PETERSON DEKKER, JARDINES Y ESQUIMALES) System.out.println("PROCESO DEKKER1 GENERO EL #"+(cd.noLineas+1)); cd.noLineas++; } cd.favorecido =2; cd.p1quiereEntrar = false; j++ ; } } }
class MainDekker { public static void main(String a[]) { ComunDekker cd = new ComunDekker(); cd.favorecido = 1; cd.noLineas = 0;
System.out.println("\n\t\tAlgoritmo de Dekker\n");
for (int i=0; i<10; i++) { new P1Dekker(cd,i).start(); new P2Dekker(cd,i).start(); } } }
REPORTE DE ALGORITMOS (PETERSON DEKKER, JARDINES Y ESQUIMALES) CORRIDA
***** Cdigo Fuente Jardines ***** Problema de los jardines: se tienen dos puertas para la visita de unos jardines. La entrada y la salida de los jardines se pueden realizar por dos puntos que disponen de dos puertas. En donde la variable comn se utiliza como cauce de comunicacin entre los distintos procesos, con el objetivo de acceder stos a sus regiones criticas con cierto orden.
class ComunDekker { int favorecido; boolean p1quiereEntrar, p2quiereEntrar;
}
class P2Dekker extends Thread REPORTE DE ALGORITMOS (PETERSON DEKKER, JARDINES Y ESQUIMALES) { ComunDekker cd; int i; public P2Dekker(ComunDekker cd, int i) { this.cd = cd; this.i = i; }
public void run() { int j=0; while(j<3) { cd.p2quiereEntrar = true; while(cd.p1quiereEntrar) { cd.p2quiereEntrar = false; while (cd.favorecido == 1); cd.p2quiereEntrar = true; } if(cd.favorecido==2) { System.out.println("Estan entrando visitantes por la puerta 2"); System.out.println("Estan saliendo por la puerta 1"); } cd.favorecido =1; cd.p2quiereEntrar = false; j++; } } }
class P1Dekker extends Thread { ComunDekker cd; int i;
public P1Dekker(ComunDekker cd, int i) { this.cd = cd; this.i = i; } public void run() { int j=0; while(j<3) { cd.p1quiereEntrar = true; while(cd.p2quiereEntrar) { cd.p1quiereEntrar = false; while (cd.favorecido == 2); cd.p1quiereEntrar = true; } if(cd.favorecido==1) { REPORTE DE ALGORITMOS (PETERSON DEKKER, JARDINES Y ESQUIMALES) System.out.println("Estan entrando visitantes por la puerta 1"); System.out.println("Estan saliendo por la puerta 2"); } cd.favorecido =2; cd.p1quiereEntrar = false; j++ ; } } }
class MainJardines { public static void main(String a[]) { ComunDekker cd = new ComunDekker(); cd.favorecido = 1;
System.out.println("\n\t\tAlgoritmo de Dekker\n");
for (int i=0; i<10; i++) { new P1Dekker(cd,i).start(); new P2Dekker(cd,i).start(); } } }
REPORTE DE ALGORITMOS (PETERSON DEKKER, JARDINES Y ESQUIMALES)
CORRIDA
REPORTE DE ALGORITMOS (PETERSON DEKKER, JARDINES Y ESQUIMALES)
***** Cdigo Fuente Esquimales ***** Problema de los esquimales: solo uno de los esquimales puede acceder a la vez al pizarrn y cuando uno delos esquimales quiere acceder al agujero para pescar debe consultar si tiene permiso par hacerlo; si el permiso lo tiene otro esquimal esperara un tiempo, cuando se le indique que tiene permiso entonces este podr ir a pescar.
while((cpescar.P1deseaPescar)&&(cpescar.procesofavorecido==2)) { if(inicio) cpescar.I.iniciarAuxiliar(); inicio=false; System.out.println("\tEsta en la pizarra el esquimal #" + (cpescar.I.obtenerDato()));
System.out.println("\n\t\tAlgoritmo de PETERSON\n"); p1.start(); p2.start();
REPORTE DE ALGORITMOS (PETERSON DEKKER, JARDINES Y ESQUIMALES) } }
CORRIDA
REPORTE DE ALGORITMOS (PETERSON DEKKER, JARDINES Y ESQUIMALES) Conclusin: Por medio de los algoritmos anteriores se estudio el problema de exclusin mutua par n procesos, en donde las instrucciones incluidas en las secciones criticas de los n procesos no se ejecutan entrelazadas en cada caso todo proceso se ejecuta en su seccin critica y deber entes entrar en ella (seccin critica) ejecutando un pre-protocolo al salir se libera a otro proceso para ejecutar.
Reflexin: Se aprendi a evitar problemas de exclusin mutua. Los programas anteriores se evita que dos o ms procesos concurrentes se encuentren ejecutando su seccin crtica al mismo tiempo.