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.