SlideShare una empresa de Scribd logo
1 de 6
Descargar para leer sin conexión
Universidad Nacional de San Antonio Abad del Cusco
Departamento Académico de Informática
Programación Concurrente y Distribuida
Práctica 5
Región Crítica Condicional
Ing. Iván Medrano Valencia
1. OBJETIVO.
Implementar las Regiones Críticas Condicionales como un mecanismo que
permite disminuir las probabilidades de que pueda ocurrir una espera activa.
2. BASE TEORICA COMPLEMENTARIA
La característica principal de una Región Crítica Condicional es que posee una sentencia
espera_a_que B. Esta sentencia produce una espera pasiva. Su semántica es la siguiente:
Si la condición B es cierta el proceso continúa por la siguiente sentencia a la
espera_a_que.
Si la condición B es falsa el proceso detiene su ejecución, abandona la RC para
permitir a otros procesos entrar en ella y pasa a una cola Qs de espera asociada con
la RC.
Cuando un proceso, que había evaluado la condición B a falso, vuelve a entrar a su RC lo
hace ejecutando de nuevo la sentencia espera_a_que, repitiéndose el comportamiento antes
descrito. Un proceso que haya evaluado la condición del espera_a_que a falso, no vuelve a
entrar en su RC hasta que otro proceso abandone esta. Esto significa que un proceso espera
a que se cumpla una condición de forma pasiva (sin ejecutarse). Vuelve a ejecutarse cuando
es probable que se haya modificado dicha condición; esto es, cuando algún otro proceso
entra en una RC asociada a la misma variable compartida y sale de ella. Es en este
momento cuando a los procesos que estaban esperando en la cola Qs de la RC se les da la
oportunidad de ejecutarse. Evidentemente puede que la condición no haya cambiado por lo
que dichos procesos se suspenderán de nuevo cuando ejecuten la sentencia espera_a_que.
Es más, si estaban esperando N procesos, sólo uno de ellos puede conseguir acceder a la RC
y puede que después de evaluar a cierto la condición del espera_a_que cambie dicha
condición haciéndola falsa de nuevo. En estas circunstancias los N-1 procesos restantes se
dormirán de nuevo después de ejecutar la sentencia espera_a_que.
Programación Concurrente y Distribuida Sincronización entre Procesos
2
Fig.1. esquema de funcionamiento de una RCC
3. IMPLEMENTACIÓN.
/---IMPLEMENTACION DE LA REGION CRITICA CONDICIONAL-------------------------/
import java.util.concurrent.Semaphore;
public class RCC
{
Semaphore v; //--cola de hilos que quieren entrar por primera vez
Semaphore s; //--cola de hilos suspendidos
Semaphore mutex;
private static int suspendidos_s; //--num. de hilos suspendidos
//--constructor
public RCC()
{
v = new Semaphore(1);
s = new Semaphore(0);
mutex= new Semaphore(1);
suspendidos_s=0;
}
//--region crítica condicional
public void espera_a_que(boolean x)
{ try
{ mutex.acquire(); //region montacargas
System.out.println("-->intentando entrar a la RCC ");
v.acquire (); //--intenta entrar por primera vez
System.out.println("-->entro a la RCC");
while (!x) //--espera_a_que B(x)
{ //--B(x)=falso
suspendidos_s++;
mutex.release();
v.release(); //--salida momentanea de la RCC
System.out.println("entraalacoladesuspendidos” +suspendidos_s);
s.acquire();
System.out.println("intentando reentrar a la RCC ");
v.acquire(); //--intento de reentrada a la RCC
}
/*--en este punto un hilo ha completado la RCC por lo que deben
pasarse los hilos suspendidos de la cola Qv --*/
Programación Concurrente y Distribuida Sincronización entre Procesos
3
while(suspendidos_s>0)
{
suspendidos_s--;
s.release();
}
v.release();
mutex.release(); //fin region montacargas
}
catch(InterruptedException e)
{
}
} //--fin de la RCC
}
//----IMPLEMENTACION DE LA CLASE MONTACARGAS COMO UNA EXTENSION DE LA CLASE RCC
import java.util.concurrent.atomic.*;
public class CMontacargas extends RCC
{ //--atributos
AtomicInteger a_numVg; //--num. de vehiculos grandes
AtomicInteger a_numVp; //--num. de vehiculos pequeños
public CMontacargas()
{
super();
a_numVg = new AtomicInteger();
a_numVp = new AtomicInteger();
}
public void entraVg() throws InterruptedException
{//--incrementa nº de vehiculos pequeños
espera_a_que((numVG()==0)&&(numVP()<=2));
System.out.println(a_numVg.addAndGet(1));
}
public synchronized int numVG()
{//-- devuelve el nº de vehiculos grandes que existen en el montacargas
return a_numVg.get();
}
public void entraVp() throws InterruptedException
{//--incrementa nº de vehiculos pequeños
espera_a_que(((numVP()<4)&&(numVG()==0)) ||
((numVP()<2) && (numVG()==1)));
System.out.println(a_numVp.addAndGet(1));
}
public synchronized int numVP()
{//-- devuelve el nº de vehiculos pequeños que existen en el montacargas
return a_numVp.get();
}
public synchronized void inicia()
{
a_numVp.set(0);
a_numVg.set(0);
}
}
Programación Concurrente y Distribuida Sincronización entre Procesos
4
//--IMPLEMENTACION DEL HILO MONTACARGAS
public class Montacargas extends Thread
{
CMontacargas a_montacargas;
public Montacargas(CMontacargas p_montacargas)
{
a_montacargas=p_montacargas;
}
public void run()
{ try
{
while (true)
{
if((a_montacargas.numVP()==2)&&(a_montacargas.numVG()==1)
||(a_montacargas.numVP()==4)&&(a_montacargas.numVG()==0))
{
System.out.println("EL MONTACARGAS ESTA LLENO. SE TRASLADA LOS
VEHICULOS");
sleep(0);
a_montacargas.inicia();
}
}
}
catch(InterruptedException e)
{
}
}
}
//--IMPLEMENTACION DEL HILO VEHICULO GRANDE
public class VehiculoGrande extends Thread
{
CMontacargas a_montacargas;
public VehiculoGrande(CMontacargas p_montacargas)
{
a_montacargas=p_montacargas;
}
public void run()
{
try
{
sleep(80);
System.out.println("NUM.VEHICULOS:"+a_montacargas.numVP()+"
"+a_montacargas.numVG());
a_montacargas.entraVg();
System.out.println("ENTRO VEHICULO GRANDE No.
P:"+a_montacargas.numVP()+" No. G:"+a_montacargas.numVG());
}
catch (InterruptedException e)
{
}
}
}
//--IMPLEMENTACION DEL HILO VEHICULO PEQUEÑO
public class VehiculoPeque extends Thread
{
Programación Concurrente y Distribuida Sincronización entre Procesos
5
CMontacargas a_montacargas;
public VehiculoPeque(CMontacargas p_montacargas)
{
a_montacargas=p_montacargas;
}
public void run()
{ try
{
sleep(30);
System.out.println("NUM.VEHICULOS:"+a_montacargas.numVP()+"
"+a_montacargas.numVG());
a_montacargas.entraVp();
System.out.println("ENTRO VEHICULO PEQUEÑO No.
P:"+a_montacargas.numVP()+" No. G:"+a_montacargas.numVG());
}
catch(InterruptedException e)
{
}
}
}
//--IMPLEMENTACION DE LA APLICACION----------------------------//
public class AppVehiculos
{
public static void main(String arg[])
{
CMontacargas RCmontacargas; //--recurso compartido
Montacargas montacargas;
VehiculoGrande vG1,vG2,vG3,vG4; //--hilos de vehiculos grandes
VehiculoPeque vP1,vP2,vP3,vP4,vP5,vP6,vP7,vP8; //--hilos de vehiculos
pequeños
RCmontacargas= new CMontacargas(); //--inicia el montacargas
montacargas = new Montacargas(RCmontacargas);
montacargas.start();
//--crear hilos de vehiculos grandes
vG1 = new VehiculoGrande(RCmontacargas);
vG2 = new VehiculoGrande(RCmontacargas);
vG3 = new VehiculoGrande(RCmontacargas);
vG4 = new VehiculoGrande(RCmontacargas);
//--crear hilos de vehiculos pequeños
vP1 = new VehiculoPeque(RCmontacargas);
vP2 = new VehiculoPeque(RCmontacargas);
vP3 = new VehiculoPeque(RCmontacargas);
vP4 = new VehiculoPeque(RCmontacargas);
vP5 = new VehiculoPeque(RCmontacargas);
vP6 = new VehiculoPeque(RCmontacargas);
vP7 = new VehiculoPeque(RCmontacargas);
vP8 = new VehiculoPeque(RCmontacargas);
//--ejecutar hilos
vG1.start();
vP3.start();
vP1.start();
vG4.start();
vG2.start();
vG3.start();
vP2.start();
vP4.start();
vP5.start();
vP6.start();
Programación Concurrente y Distribuida Sincronización entre Procesos
6
vP7.start();
vP8.start();
}
}
4. CUESTIONARIO.
a) Implemente el problema del engrapador de papeles resuelto en clases.
b) Implemente el problema de la carretera de ambos sentidos de circulación.
5. TRABAJO
a) Modifique la Región Crítica Condicional para que maneje una cola de urgentes, y
utilice éste para resolver los problemas vistos hasta ahora.
6. BIBLIOGRAFÍA
Doug Lea “Programación Concurrente en Java” 2da. Edición.
Addison Wesley 2001.
Deitel y Deitel “JAVA How to Program” 3ra. Edición Prentice Hall
1999.
Ken Arnold “El Lenguaje de Programación JAVA”. 3ra. Edición.
James Goslin Addison Wesley 2001
David Holmes
http://www.oup-usa.org/docs Oxford University Press
http://java.sun.com/ Sun MicroSystems.

Más contenido relacionado

Similar a Practica5

3 java sesin 3 pps
3 java sesin 3 pps3 java sesin 3 pps
3 java sesin 3 pps
ajplbe
 
Lec10 j estrcontrol
Lec10 j estrcontrolLec10 j estrcontrol
Lec10 j estrcontrol
htmrk
 
Estructuras De RepeticióN
Estructuras De RepeticióNEstructuras De RepeticióN
Estructuras De RepeticióN
Regina Flores
 
Estructuras De RepeticióN
Estructuras De RepeticióNEstructuras De RepeticióN
Estructuras De RepeticióN
Regina Flores
 
Sincronizacion de procesos
Sincronizacion de procesosSincronizacion de procesos
Sincronizacion de procesos
kruskaya salazar
 
PLC: condicionamiento de acciones y receptividades GRAFCET
PLC: condicionamiento de acciones y receptividades GRAFCETPLC: condicionamiento de acciones y receptividades GRAFCET
PLC: condicionamiento de acciones y receptividades GRAFCET
SANTIAGO PABLO ALBERTO
 

Similar a Practica5 (20)

Manejo Flexible Robusto y Eficiente de Módulos GSM
Manejo Flexible Robusto y Eficiente de Módulos GSMManejo Flexible Robusto y Eficiente de Módulos GSM
Manejo Flexible Robusto y Eficiente de Módulos GSM
 
JQuery Deferred
JQuery DeferredJQuery Deferred
JQuery Deferred
 
3 java sesin 3 pps
3 java sesin 3 pps3 java sesin 3 pps
3 java sesin 3 pps
 
1.6 problemas con estructuras repetitivas
1.6 problemas con estructuras repetitivas1.6 problemas con estructuras repetitivas
1.6 problemas con estructuras repetitivas
 
Lec10 j estrcontrol
Lec10 j estrcontrolLec10 j estrcontrol
Lec10 j estrcontrol
 
Lab 08.docx
Lab 08.docxLab 08.docx
Lab 08.docx
 
Estructuras De RepeticióN
Estructuras De RepeticióNEstructuras De RepeticióN
Estructuras De RepeticióN
 
Estructuras De RepeticióN
Estructuras De RepeticióNEstructuras De RepeticióN
Estructuras De RepeticióN
 
Microcontroladores PIC: Implementación de una maquina de estados en un PIC
Microcontroladores PIC: Implementación de una maquina de estados en un PICMicrocontroladores PIC: Implementación de una maquina de estados en un PIC
Microcontroladores PIC: Implementación de una maquina de estados en un PIC
 
analisis-y-simulacion-de-sistema-discreto-con-matlab
 analisis-y-simulacion-de-sistema-discreto-con-matlab analisis-y-simulacion-de-sistema-discreto-con-matlab
analisis-y-simulacion-de-sistema-discreto-con-matlab
 
Sincronizacion de procesos
Sincronizacion de procesosSincronizacion de procesos
Sincronizacion de procesos
 
Procesos
ProcesosProcesos
Procesos
 
PLC: condicionamiento de acciones y receptividades GRAFCET
PLC: condicionamiento de acciones y receptividades GRAFCETPLC: condicionamiento de acciones y receptividades GRAFCET
PLC: condicionamiento de acciones y receptividades GRAFCET
 
Case for ymas
Case for ymasCase for ymas
Case for ymas
 
5.3 instruccion while
5.3 instruccion while5.3 instruccion while
5.3 instruccion while
 
2 produccion
2 produccion2 produccion
2 produccion
 
practicas dfd
practicas dfdpracticas dfd
practicas dfd
 
Bitacora3
Bitacora3Bitacora3
Bitacora3
 
Aplicación de un modelo estocástico en un proceso
Aplicación de un modelo estocástico en un procesoAplicación de un modelo estocástico en un proceso
Aplicación de un modelo estocástico en un proceso
 
2ª unidad de algoritmo
2ª unidad de algoritmo2ª unidad de algoritmo
2ª unidad de algoritmo
 

Practica5

  • 1. Universidad Nacional de San Antonio Abad del Cusco Departamento Académico de Informática Programación Concurrente y Distribuida Práctica 5 Región Crítica Condicional Ing. Iván Medrano Valencia 1. OBJETIVO. Implementar las Regiones Críticas Condicionales como un mecanismo que permite disminuir las probabilidades de que pueda ocurrir una espera activa. 2. BASE TEORICA COMPLEMENTARIA La característica principal de una Región Crítica Condicional es que posee una sentencia espera_a_que B. Esta sentencia produce una espera pasiva. Su semántica es la siguiente: Si la condición B es cierta el proceso continúa por la siguiente sentencia a la espera_a_que. Si la condición B es falsa el proceso detiene su ejecución, abandona la RC para permitir a otros procesos entrar en ella y pasa a una cola Qs de espera asociada con la RC. Cuando un proceso, que había evaluado la condición B a falso, vuelve a entrar a su RC lo hace ejecutando de nuevo la sentencia espera_a_que, repitiéndose el comportamiento antes descrito. Un proceso que haya evaluado la condición del espera_a_que a falso, no vuelve a entrar en su RC hasta que otro proceso abandone esta. Esto significa que un proceso espera a que se cumpla una condición de forma pasiva (sin ejecutarse). Vuelve a ejecutarse cuando es probable que se haya modificado dicha condición; esto es, cuando algún otro proceso entra en una RC asociada a la misma variable compartida y sale de ella. Es en este momento cuando a los procesos que estaban esperando en la cola Qs de la RC se les da la oportunidad de ejecutarse. Evidentemente puede que la condición no haya cambiado por lo que dichos procesos se suspenderán de nuevo cuando ejecuten la sentencia espera_a_que. Es más, si estaban esperando N procesos, sólo uno de ellos puede conseguir acceder a la RC y puede que después de evaluar a cierto la condición del espera_a_que cambie dicha condición haciéndola falsa de nuevo. En estas circunstancias los N-1 procesos restantes se dormirán de nuevo después de ejecutar la sentencia espera_a_que.
  • 2. Programación Concurrente y Distribuida Sincronización entre Procesos 2 Fig.1. esquema de funcionamiento de una RCC 3. IMPLEMENTACIÓN. /---IMPLEMENTACION DE LA REGION CRITICA CONDICIONAL-------------------------/ import java.util.concurrent.Semaphore; public class RCC { Semaphore v; //--cola de hilos que quieren entrar por primera vez Semaphore s; //--cola de hilos suspendidos Semaphore mutex; private static int suspendidos_s; //--num. de hilos suspendidos //--constructor public RCC() { v = new Semaphore(1); s = new Semaphore(0); mutex= new Semaphore(1); suspendidos_s=0; } //--region crítica condicional public void espera_a_que(boolean x) { try { mutex.acquire(); //region montacargas System.out.println("-->intentando entrar a la RCC "); v.acquire (); //--intenta entrar por primera vez System.out.println("-->entro a la RCC"); while (!x) //--espera_a_que B(x) { //--B(x)=falso suspendidos_s++; mutex.release(); v.release(); //--salida momentanea de la RCC System.out.println("entraalacoladesuspendidos” +suspendidos_s); s.acquire(); System.out.println("intentando reentrar a la RCC "); v.acquire(); //--intento de reentrada a la RCC } /*--en este punto un hilo ha completado la RCC por lo que deben pasarse los hilos suspendidos de la cola Qv --*/
  • 3. Programación Concurrente y Distribuida Sincronización entre Procesos 3 while(suspendidos_s>0) { suspendidos_s--; s.release(); } v.release(); mutex.release(); //fin region montacargas } catch(InterruptedException e) { } } //--fin de la RCC } //----IMPLEMENTACION DE LA CLASE MONTACARGAS COMO UNA EXTENSION DE LA CLASE RCC import java.util.concurrent.atomic.*; public class CMontacargas extends RCC { //--atributos AtomicInteger a_numVg; //--num. de vehiculos grandes AtomicInteger a_numVp; //--num. de vehiculos pequeños public CMontacargas() { super(); a_numVg = new AtomicInteger(); a_numVp = new AtomicInteger(); } public void entraVg() throws InterruptedException {//--incrementa nº de vehiculos pequeños espera_a_que((numVG()==0)&&(numVP()<=2)); System.out.println(a_numVg.addAndGet(1)); } public synchronized int numVG() {//-- devuelve el nº de vehiculos grandes que existen en el montacargas return a_numVg.get(); } public void entraVp() throws InterruptedException {//--incrementa nº de vehiculos pequeños espera_a_que(((numVP()<4)&&(numVG()==0)) || ((numVP()<2) && (numVG()==1))); System.out.println(a_numVp.addAndGet(1)); } public synchronized int numVP() {//-- devuelve el nº de vehiculos pequeños que existen en el montacargas return a_numVp.get(); } public synchronized void inicia() { a_numVp.set(0); a_numVg.set(0); } }
  • 4. Programación Concurrente y Distribuida Sincronización entre Procesos 4 //--IMPLEMENTACION DEL HILO MONTACARGAS public class Montacargas extends Thread { CMontacargas a_montacargas; public Montacargas(CMontacargas p_montacargas) { a_montacargas=p_montacargas; } public void run() { try { while (true) { if((a_montacargas.numVP()==2)&&(a_montacargas.numVG()==1) ||(a_montacargas.numVP()==4)&&(a_montacargas.numVG()==0)) { System.out.println("EL MONTACARGAS ESTA LLENO. SE TRASLADA LOS VEHICULOS"); sleep(0); a_montacargas.inicia(); } } } catch(InterruptedException e) { } } } //--IMPLEMENTACION DEL HILO VEHICULO GRANDE public class VehiculoGrande extends Thread { CMontacargas a_montacargas; public VehiculoGrande(CMontacargas p_montacargas) { a_montacargas=p_montacargas; } public void run() { try { sleep(80); System.out.println("NUM.VEHICULOS:"+a_montacargas.numVP()+" "+a_montacargas.numVG()); a_montacargas.entraVg(); System.out.println("ENTRO VEHICULO GRANDE No. P:"+a_montacargas.numVP()+" No. G:"+a_montacargas.numVG()); } catch (InterruptedException e) { } } } //--IMPLEMENTACION DEL HILO VEHICULO PEQUEÑO public class VehiculoPeque extends Thread {
  • 5. Programación Concurrente y Distribuida Sincronización entre Procesos 5 CMontacargas a_montacargas; public VehiculoPeque(CMontacargas p_montacargas) { a_montacargas=p_montacargas; } public void run() { try { sleep(30); System.out.println("NUM.VEHICULOS:"+a_montacargas.numVP()+" "+a_montacargas.numVG()); a_montacargas.entraVp(); System.out.println("ENTRO VEHICULO PEQUEÑO No. P:"+a_montacargas.numVP()+" No. G:"+a_montacargas.numVG()); } catch(InterruptedException e) { } } } //--IMPLEMENTACION DE LA APLICACION----------------------------// public class AppVehiculos { public static void main(String arg[]) { CMontacargas RCmontacargas; //--recurso compartido Montacargas montacargas; VehiculoGrande vG1,vG2,vG3,vG4; //--hilos de vehiculos grandes VehiculoPeque vP1,vP2,vP3,vP4,vP5,vP6,vP7,vP8; //--hilos de vehiculos pequeños RCmontacargas= new CMontacargas(); //--inicia el montacargas montacargas = new Montacargas(RCmontacargas); montacargas.start(); //--crear hilos de vehiculos grandes vG1 = new VehiculoGrande(RCmontacargas); vG2 = new VehiculoGrande(RCmontacargas); vG3 = new VehiculoGrande(RCmontacargas); vG4 = new VehiculoGrande(RCmontacargas); //--crear hilos de vehiculos pequeños vP1 = new VehiculoPeque(RCmontacargas); vP2 = new VehiculoPeque(RCmontacargas); vP3 = new VehiculoPeque(RCmontacargas); vP4 = new VehiculoPeque(RCmontacargas); vP5 = new VehiculoPeque(RCmontacargas); vP6 = new VehiculoPeque(RCmontacargas); vP7 = new VehiculoPeque(RCmontacargas); vP8 = new VehiculoPeque(RCmontacargas); //--ejecutar hilos vG1.start(); vP3.start(); vP1.start(); vG4.start(); vG2.start(); vG3.start(); vP2.start(); vP4.start(); vP5.start(); vP6.start();
  • 6. Programación Concurrente y Distribuida Sincronización entre Procesos 6 vP7.start(); vP8.start(); } } 4. CUESTIONARIO. a) Implemente el problema del engrapador de papeles resuelto en clases. b) Implemente el problema de la carretera de ambos sentidos de circulación. 5. TRABAJO a) Modifique la Región Crítica Condicional para que maneje una cola de urgentes, y utilice éste para resolver los problemas vistos hasta ahora. 6. BIBLIOGRAFÍA Doug Lea “Programación Concurrente en Java” 2da. Edición. Addison Wesley 2001. Deitel y Deitel “JAVA How to Program” 3ra. Edición Prentice Hall 1999. Ken Arnold “El Lenguaje de Programación JAVA”. 3ra. Edición. James Goslin Addison Wesley 2001 David Holmes http://www.oup-usa.org/docs Oxford University Press http://java.sun.com/ Sun MicroSystems.