Академический Документы
Профессиональный Документы
Культура Документы
ALUMNOS:
MARCELA PAOLA ESTRADA GARCA
JAMELLI VAZQUEZ JUAREZ
GUSTAVO ANGEL OSORIO TELLEZ
KEVIN ESLI DIAZ ALONSO
PROFESORA:
MA. CARMEN CERN GARNICA
OTOO 2013
MONITORES
Un monitor es una construccin sintctica de un lenguaje de programacin concurrente que
encapsula una estructura de datos o recurso que se ha de proteger mediante exclusin mutua,
junto con un conjunto de procedimientos que manejan ese recurso.
La interface del monitor con el exterior es el conjunto de llamadas a procedimientos del
monitor especificadas en su definicin. Los procesos requieren los servicios de los monitores
mediante llamadas a sus procedimientos.
La semntica de cualquier monitor es tal que slo a un proceso se le permite ejecutar uno de
los procedimientos del monitor en un instante dado, con lo que aseguramos la exclusin
mutua sobre las variables y recursos globales.
El problema de la exclusin mutua de los datos, queda automticamente resuelto por el hecho
de usar un monitor. Sin embargo, dentro del monitor puede ser necesarios en ocasiones
sincronizar a los procedimientosque lo componen. La sincronizacin a nivel interno en los
monitores se consigue utilizando las variables de condicin o seales, que son variables que
no toman ningn tipo de valor, pero tiene asociada una lista de procesos suspendidos.
Sus operaciones son:
Delay , suspende el proceso que lo ejecuta y lo incluye en la lista de una variable
Condition.
Resume, Reactiva un proceso de la lista asociada a una variable Condition.
Empty , retorna True si la lista de procesos de la variable est vaca.
Ejercicio 1.
PLANTEAMIENTO
Supongamos que queremos controlar el acceso a un parking con el siguiente comportamiento:
Cuando un coche llega al parking ste espera, espera a que la barrera de acceso al parking se
levante. La barrera slo se levantar cuando el parking no est lleno, el semforo que est
detrs est verde y la mquina de tickets ha expendido un ticket. La barrera baja cuando
detecta que el coche ha pasado. La mquina de tickets expende un ticket cuando detecta que
se ha pulsado el botn de la mquina. Cuando la barrera est levantada entonces el coche
pasa. Despus de pasar el coche, la barrera se baja. Pasado un tiempo desde que el coche
aparc, ste sale del parking.
Se consideran 4 procesos: coche, maquinaTikets, Barrera y semforo
CDIGO EN JAVA:
//clase Semaforo
publicclassSemaforo {
protectedint contador = 0;
publicSemaforo (intvalorInicial) {
contador = valorInicial;
}
synchronizedpublicvoid WAIT () {
while (contador == 0)
try {
wait();
}
catch (Exception e) {}
contador--;
}
synchronizedpublicvoid SIGNAL () {
contador = 1;
notify();
}
}
//clase Monitor
publicclass monitor {
privateSemaforomon;
public monitor() {
mon = new Semaforo(1);
}
publicvoidenter() {
mon.WAIT();
}
publicvoidexit() {
mon.SIGNAL();
}
publiccondicioncreaCond() {
return new condicion(mon);
}
}
//clase condicin
publicclasscondicion{
privateSemaforocond, mon;
privateintwaiting;
publiccondicion(Semaforomon) {
cond = new Semaforo(0);
this.mon = mon;
waiting = 0;
}
publicvoid WAIT() {
waiting++;
mon.SIGNAL();
cond.WAIT();
mon.WAIT();
}
publicvoid SIGNAL() {
if(waiting> 0) {
waiting--;
}
cond.SIGNAL();
}
publicvoidbroadcast_cond() {
for(; waiting> 0; waiting--)
cond.SIGNAL();
}
publicbooleanhas_waiting() {
returnwaiting> 0;
}
}
//programa principal parking con los procesos barra,maquinaTikets , coche
publicclass parking {
staticcarPark e;
publicstaticvoidmain(Stringargs[]) {
int i;
e = new carPark();
Coche coches[] = new Coche[10];
MaquinaTikets maquina = new MaquinaTikets(e);
Barrera barrera = new Barrera(e);
Thread.sleep(1000);
}
catch(Exception e) {}
mon.enter();
numCoches.SIGNAL();
System.out.println("Salio Coche: "+i);
mon.exit();
}
publicvoidpasaCoche() {
while(true) {
mon.enter();
numCoches.WAIT();
ticketExpedido.WAIT();
Subirbarrera.SIGNAL();
System.out.println("Subiendo Barra...");
cocheHaPasado.WAIT();
System.out.println("Bajando Barra...");
BajarBarrera.SIGNAL();
mon.exit();
}
}
publicvoidexpideTiket() {
while(true) {
mon.enter();
boton.WAIT();
System.out.println("Expidiendo ticket...");
ticketExpedido.SIGNAL();
mon.exit();
}
}
}
class Coche extendsThread {
int i;
carPark e;
public Coche(int _i, carPark e) {
i = _i;
this.e = e;
}
publicvoidrun() {
e.esperaPasar(i);
}
}
classMaquinaTiketsextendsThread {
carPark e;
publicMaquinaTikets(carPark e) {
this.e = e;
}
publicvoidrun() {
e.expideTiket();
}
}
class Barra extendsThread {
carPark e;
public Barra(carPark e) {
this.e = e;
}
publicvoidrun() {
e.pasaCoche();
}
}
CAPTURAS DE PANTALLA:
EJERCICIO 2
PLANTEAMIENTO:
En una sala con 30 filas de 10 asientos cada uno se realiza un congreso. La sala tiene dos
entradas por donde entran los congresistas. Suponga que existen N congresistas que cuando
llegan hacen cola en la entrada en la entrada que en ese momento tenga menos gente. En caso
que la sala est llena el congresista se va.
Hay 3 acomodadores que van ubicando de a uno a los primeros de las colas hasta que la sala
este llena o hasta que termine la conferencia. Para acomodar a los congresistas los
acomodadores buscan un asiento libre y lo dejan en la punta de la fila indicndoles su asiento,
para que luego el congresista se siente. Cuando se sentaron 40 congresistas comienza el
congreso que dura 2 ha (modelice el tiempo con la funcin delay(x) que retarda un proceso x
minutos) una vez que termina el congreso deben concluir todos los procesos. La entrada a la
conferencia no interfiere con la bsqueda de los asientos libres.
CODIGO EN JAVA:
class Monitor
{
private String cad;
privateboolean permiso1=true;
privateboolean permiso2=true;
privateboolean permiso3=true;
public Monitor()
{
cad=null;
}
{
this.m = m;
}
public void run()
{
for(int i=0;i<12;i++)
{
m.AsientoD(" Ingresando por Acceso B");
}
System.out.println("**El Congreso ha terminado**");
}
}
public class BuscaA {
int AD[][] = new int[30][10];
publicBuscaA() {
}
public void SCongreso(){
for(inti=0; i<30; i++)
for(int j=0; j<10; j++)
AD[i][j]=0;
}
public void Llenar(int a, int b){
intcont=0;
if(AD[a][b]==0){
AD[a][b]=1;
cont++;
if(cont==40)
System.out.println("***********INICIA CONGRESO**********");
}
}
}
class Acomodador1 implements Runnable
{
Monitor m;
int a;
BuscaA p= new BuscaA();
public Acomodador1(Monitor m)
{
this.m = m;
}
public void run()
{
for(inti=0;i<10;i++)
for(int j=0; j<3;j++)
{
p.Llenar(i,j);
m.Acomodador1("Acomodando
columna "+j);
}
}
}
Congresista
*Asiento:
fila
"+i+"
Congresista
*Asiento:
fila
"+i+"
Congresista
*Asiento:
fila
"+i+"
EJERCICIO #3
PLANTEAMIENTO:
En una carpintera se realizan muebles ensamblando 3 partes, existen N1 carpinteros para
realizar la parte1, N2 carpinteros para realizar la parte2, N3 para la parte3; mas N carpinteros
que se encargan de ensamblar las 3 partes del mueble.
Los encargados de ensamblar deben tomar una pieza de cada clase juntar las partes y una vez
ensambladas los carpinteros que le dieron la pieza pueden seguir trabajando (no antes). En la
carpintera solo se armaran 30 muebles y no se podrn producir piezas de ms.
El armado debe hacerse en forma concurrente solo pueden esperarse entre los carpinteros de
un mismo tipo cuando terminan una pieza hasta que los tome un ensamblador (es decir puede
pensar que los ensambladores toman las piezas de a uno). Todos los procesos deben terminar
correctamente, no pueden quedar procesos colgados.
CLASES Y PAQUETES:
Se crean 6 clases, la clase Monitor.java, que es como su nombre lo dice, es el monitor del
programa, por lo cual contiene los 4 procesos sincronizados. Las clases Parte1.java,
Parte2.java, Parte3.java, Ensamblar.java, se crean los hilos implementando la interfaz
Runnable, en cada uno de los hilos creados, mediante su mtodo run, se manda a llamar el
mtodo correspondiente a cada clase. Por ltimo la clase Principal.java, se crea el monitor, y
un hilo para cada clase, se lanzan mediante el mtodo nombre_hilo.start().
CODIGO EN JAVA:
class Monitor
{
private String cad;
private boolean permiso1=true;
private boolean permiso2=true;
private boolean permiso3=true;
public Monitor()
{
cad=null;
}
public synchronized void ArmaParte1 (String cad)
{
while(permiso1==false)
{
try
{
wait();
}catch (Exception e){}
}
System.out.println("Nombre: "+Thread.currentThread().getName()+cad);
permiso1=false;
notify();
}
public synchronized void ArmaParte2 (String cad)
{
while(permiso2==false)
{
try
{
wait();
}catch (Exception e){}
}
System.out.println("Nombre: "+Thread.currentThread().getName()+cad);
permiso2=false;
notify();
}
public synchronized void ArmaParte3 (String cad)
{
while(permiso3==false)
{
try
{
wait();
}catch (Exception e){}
}
System.out.println("Nombre: "+Thread.currentThread().getName()+cad);
permiso3=false;
notify();
}
public synchronized void EnsamblaPieza (String cad)
{
while (permiso1==true)
{
try
{
wait();
}catch (Exception e){}
}
while (permiso2==true)
{
try
{
wait();
}catch (Exception e){}
}
while (permiso3==true)
{
try
{
wait();
}catch (Exception e){}
}
System.out.println("Nombre: "+Thread.currentThread().getName()+cad);
permiso1=true;
permiso2=true;
permiso3=true;
notifyAll();
}
}
class Parte1 implements Runnable
{
Monitor m;
public Parte1(Monitor m)
{
this.m = m;
}
public void run()
{
for(int i=0;i<30;i++)
{
m.ArmaParte1(" Armando pieza 1 ");
}
}
}
class Parte2 implements Runnable
{
Monitor m;
public Parte2(Monitor m)
{
this.m = m;
}
public void run()
{
for(int i=0;i<30;i++)
{
m.ArmaParte2(" Armando pieza 2 ");
}
}
}
class Parte3 implements Runnable
{
Monitor m;
public Parte3(Monitor m)
{
this.m = m;
}
public void run()
{
for(int i=0;i<30;i++)
{
m.ArmaParte3(" Armando pieza 3");
}
}
}
class Ensamblar implements Runnable
{
Monitor m;
public Ensamblar(Monitor m)
{
this.m = m;
}
public void run()
{
for(int i=0;i<30;i++)
{
m.EnsamblaPieza(" Ensamblando mueble"+i);
}
}
}
public class Principal {
public static void main(String[] args)
{
Monitor m = new Monitor();
Parte1 p1= new Parte1(m);
Parte2 p2= new Parte2(m);
Parte3 p3= new Parte3(m);
Ensamblar p4=new Ensamblar(m);
Thread a = new Thread(p1);
Thread b = new Thread(p2);
Thread c = new Thread(p3);
Thread d = new Thread(p4);
a.start();
b.start();
c.start();
d.start();
}}
CAPTURA DE PANTALLA:
EJERCICIO 4
PLANTEAMIENTO:
Supongamos que una carretera por la que circulan coches en los dos sentidos. La carretera
cruza un ro donde solo es posible la circulacin de coches en un sentido. Sobre el puente
pueden estar varios coches del mismo sentido.
CODIGO EN JAVA:
public class CochesOeste extends Thread
{
Puente puente;
publicCochesOeste(Puente p_puente)
{
puente = p_puente;
}
public void run()
{
try
{
puente.entrarCocheOeste(); //tratar de pasar x el puente
System.out.println("ENTRO "+getName());
//PASAR EL PUENTE
sleep(200);
puente.salirCocheOeste();
System.out.println("SALIO "+getName());
}
catch (InterruptedException e)
{
}
}
}
public class CochesEste extends Thread
{ Puentepuente;
publicCochesEste(Puente p_puente)
{
puente = p_puente;
}
public void run()
{
try
{
puente.entrarCocheEste(); //tratar de pasar x el puente
System.out.println("ENTRO "+getName());
//PASAR EL PUENTE
sleep(100);
puente.salirCocheEste();
System.out.println("SALIO "+getName());
}
catch (InterruptedException e)
{
}
}
}
importjava.util.concurrent.locks.*;
public class Puente
{
finalReentrantLockcerrojo = new ReentrantLock();
final Condition okCocheE = cerrojo.newCondition();
final Condition okCocheO = cerrojo.newCondition();
intc,b;
public Puente()
{
b=0;
c=0;
}
public void entrarCocheEste() throws InterruptedException
{
cerrojo.lock();
try
{
while ((b>0)) {
System.out.println("coche del Este esperando..puente ocupado");
okCocheE.await(); //el coche espera
}
c++; //--incrementa el nmero de coches pasando
okCocheE.signal(); //--despierta si hay otro coche esperando
//BAJAR PUENTE
}
finally
{
cerrojo.unlock();
}
}
public void salirCocheEste() throws InterruptedException
{
cerrojo.lock();
try
{
System.out.println("coche del ESTE saliendo..puente libre");
c--; //--disminuye el nro. de coches pasando
if (c==0)
okCocheO.signal(); //--el ltimo coche que pasa
//--comunica al cohe que puede pasar (si
//--hubiera)
}
finally
{
cerrojo.unlock();
}
}
publicvoidentrarCocheOeste() throwsInterruptedException
{
cerrojo.lock();
try
{
while ((c>0)) //--si hay coches pasando
{
System.out.println("Coche del OESTE esperando..puente ocupado");
okCocheO.await(); //--esperar a que pasen los coches
}
b++; //--incrementa el no. de coches pasando
okCocheO.signal(); //--despierta a otro coche si hubiera
//--para que intente pasar
}
finally
{
cerrojo.unlock();
}
}
public void salirCocheOeste() throws InterruptedException
{
cerrojo.lock();
try
{
System.out.println("Coche del OESTE saliendo..puente libre");
b--; //--disminuye el num. decoches pasando
if(b==0)
okCocheE.signal(); //-- el ltimo coche comunica al coche
//--que espera (si hubiera) que puede intentar pasar
}
finally
{
cerrojo.unlock();
}
}
privateint awaited(Condition condicion)
{ //--devuelve el nmero de hilos que esperan sobre la variable condicion
returncerrojo.getWaitQueueLength(condicion);
}
}
public class AppCarrera
{
public static void main(String arg[])
{
booleancarrera=true;
int lap=1;
//--CREAR EL MONITOR
while( carrera==true){
Puente puente = new Puente();
//--CREAR LOS HILOS A LOS QUE SE PASA COMO PARAMETRO EL MONITOR A UTILIZAR
CochesEste c1 = new CochesEste(puente);
CochesOeste b1 = new CochesOeste(puente);
CochesEste c2 = new CochesEste(puente);
CochesOeste b2 = new CochesOeste(puente);
CochesEste c3 = new CochesEste(puente);
CochesOeste b3 = new CochesOeste(puente);
CochesEste c4 = new CochesEste(puente);
CochesOeste b4 = new CochesOeste(puente);
CochesEste c5 = new CochesEste(puente);
CochesOeste b5 = new CochesOeste(puente);
//--PONER NOMBRE A LOS HILOS
//inicia la carrera
c1.setName("CocheE 01\n");
c2.setName("CocheE 02\n");
c3.setName("CocheE 03\n");
c4.setName("CocheE 04\n");
c5.setName("CocheE 05\n");
b1.setName("CocheO 06\n");
b2.setName("CocheO 07\n");
b3.setName("CocheO 08\n");
b4.setName("CocheO 09\n");
b5.setName("CocheO 10\n");
//--EJECUTAR LOS HILOS
try
{
System.out.println(" 'Lap: "+lap+"'");
c1.start();
b1.start();
c2.start();
b2.start();
c3.start();
b3.start();
c4.start();
b4.start();
c5.start();
b5.start();
lap++;
if(lap>=5){
carrera=false;}
Thread.sleep(3000);
}catch (InterruptedException e)
{
}
}
}
}
CAPTURAS DE PANTALLA:
CAPTURA DE PANTALLA:
}
public synchronized void asigna_calif(float valor) {
while (disponible == false) {//true
try {
wait();
} catch (InterruptedException e) {
}
}
calificacion = valor;
disponible = false; //true;
notify();
}
}
class Docente extends Thread {
private Monitor monitor1;
private int num;
private float calif;
public Docente(Monitor m, float n)
{
monitor1 = m;
calif=n;
}
public void run() {
//for(int i=0;i<5;i++)
monitor1.asigna_calif(calif);
System.out.println("Docente #"+this.num+" pone: " +calif);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) {
}
}
}
class Alumno extends Thread {
private Monitor monitor1 ;
private int num;
public Alumno(Monitor m)
{
monitor1 = m;
}
public void run() {
float valor = 0;
//for (int i = 0; i < 5; i++)
{
valor = monitor1.consulta_calif();
System.out.println("Alumno #"+this.num+" obtiene: "+valor );
}
}
}
import java.util.Scanner;
import java.io.*;
public class Principal
{
public static void main(String args[])
{
Scanner lector= new Scanner(System.in);
Monitor m= new Monitor();
int i=0;
do{
try
{
System.in.read();
}
catch(java.io.IOException e) {}
System.out.println("Introduzca calificacin:");
float cal=lector.nextFloat();
Docente hilo1 =new Docente(m,cal);
Alumno hilo2= new Alumno(m);
hilo1.start();
hilo2.start();
}while(i<10);
}
}
CAPTURA DE PANTALLA:
while(contador == 0)
wait();
}
catch (InterruptedException e){};
contador--;
}
}
//clase Mesa
class Mesa
{
private Tenedor tenedores[];
privateint comensales;
public Mesa (int comensales)
{
this.comensales= comensales;
tenedores= new Tenedor[comensales];
for (int i= 0; i < comensales; i++)
tenedores[i]= new Tenedor(i);
}
public Tenedor tenedor(int i)
{
return tenedores[i];
}
publicintmi_tenedor_derecho(int i)
{
return (i+1)%comensales;
}
publicintmi_tenedor_izquierdo(int i)
{
return i;
}
}
//clase Tenedor
class Tenedor
{
privateint identidad;
privateboolean cogido;
t.start();
}
protectedvoid pensar()
{
try
{
System.out.println ("Filosofo " + identidad + " esta pensando");
intdelay= (int)(Math.random()*1000);
t.sleep(delay);
System.out.println ("Filosofo " + identidad + " ha dejado de pensar");
} catch (InterruptedException e) {}
}
protectedvoid comer()
{
try
{
System.out.println ("Filosofo " + identidad + " esta comiendo");
intdelay= (int)(Math.random()*1000);
t.sleep(delay);
System.out.println ("Filosofo " + identidad + " ha terminado de comer");
} catch (InterruptedException e) {}
}
protectedvoidprotocolo_entrada()
{
System.out.println ("Protocolo antiguo");
Tenedor tizq= mesa.tenedor(ind_izq);
Tenedor tder= mesa.tenedor(ind_der);
tizq.coger();
tder.coger();
}
protectedvoidprotocolo_salida()
{
Tenedor tizq= mesa.tenedor(ind_izq);
Tenedor tder= mesa.tenedor(ind_der);
tizq.soltar();
tder.soltar();
}
publicvoidrun()
{
while (true)
{
pensar();
protocolo_entrada();
comer();
protocolo_salida();
}
}
}
// Principal
class principal
{
publicstaticvoidmain (Stringargs[])
{
int comensales=5;
System.out.println ("Poniendo la mesa para " + comensales + " comensales");
Mesa mesa= new Mesa(comensales);
System.out.println ("Creando a los filosofos y sentandolos a la mesa");
for (int i= 0; i<comensales; i++)
{
Filosofo f= new Filosofo(i, mesa);
}
}
}
CAPTURAS DE PANTALLA:
}
catch(InterruptedException e){
}
permiso1=true;
notify();
}
synchronized void esperanota(){
if(!permiso1)
try{
wait();
}
catch(InterruptedException e){
}
permiso1=false;
notify();
}
///////////////////////////////////////ve a pagar
synchronized void danota(){
if(permiso2)
try{
wait();
}
catch(InterruptedException e){
}
permiso2=true;
notify();
}
synchronized void paga(){
if(!permiso2)
try{
wait();
}
catch(InterruptedException e){
}
permiso2=false;
notify();
}
//////////////////////////////////////////////
synchronized void pagaclie(){
if(permiso3)
try{
wait();
}
catch(InterruptedException e){
}
permiso3=true;
notify();
}
synchronized void esperaven(){
if(!permiso3)
try{
wait();
}
catch(InterruptedException e){
}
permiso3=false;
notify();
}
//////////////////////////////////
synchronized void dafactura(){
if(!permiso4)
try{
wait();
}
catch(InterruptedException e){
}
System.out.println("Recibe factura con numero "+numfac);
permiso4=false;
notify();
}
synchronized void pagoclie(){
if(permiso4)
try{
wait();
}
catch(InterruptedException e){
}
permiso4=true;
notify();
}
}
CAPTURA DE PANTALLA:
System.out.println("//Sigo durmiendo...");
if (misioneros == 5) {
notify();
return true;
}
else {
notify();
return false;
}
}
lleno=false;
//notify();
// Le digo al cocinero que saque uno de la olla
try { wait(); } catch (InterruptedException ex) { } // Espero a que lo saque
}
System.out.println("Me comere uno...");
System.out.println("ME COMi A UN MISIONERO!!!!");
misioneros--;
// Esperara al siguiente listo
notify();
// Notifico que ya comif (misioneros == 0) {
return false;
}
else return true;
}
}
CAPTURA DE PANTALLA:
DIAPOSITIVAS
PROGRAMA 1: PRODUCTOR CONSUMIDOR
El productor genera un entero entre 0 y 9, lo almacena en un objeto Monitor_Almacen,
e imprime el nmero generado, el productor duerme durante un tiempo aleatorio entre
0 y 100 milisegundos antes de repetir el ciclo de generacin de nmeros.
El consumidor, por su parte, est hambriento, consume todos los enteros de
Monitor_Almacen (exactamente el mismo objeto en que el productor puso los enteros
tan pronto como estn disponibles.