You are on page 1of 8

Monitores

Qu son los monitores?

Herramienta de alto nivel Def.: Son variables, estructuras de datos y procedimientos encapsulados en un paquete. Propiedades:
Las variables de monitor no son accesibles por otros procesos o hilos Slo un proceso puede estar activo en un procedimiento de monitor (mutex)

Secciones crticas condicionales


Hasta ahora hemos visto secciones crticas incondicionales Problema:
un proceso entra a una seccin crtica, pero no cumple con cierta condicin para modificar datos compartidos, entonces debe esperar La espera no debe ser activa, por razones de eficiencia

Solucin:
Seccin crtica condicional (SCC) Modelo:
If not.condition then await() SCC

Cmo se implementa una SCC en monitores?


Se usan las llamadas al sistema notify() (signal()) y wait().

Cmo aplicar la instruccin signal()? Problema:


El uso incorrecto de signal() puede derivar en situaciones donde dos o ms procesos, al mismo tiempo, pueden estar trabajando en su seccin crtica.

Solucin:
Reglas:
Hoare
muy complicado de implementar en los compiladores de lenguajes de programacin.

Brinch Hansen
Si en un procedimiento de monitor se usa signal(), entonces esta instruccin debe ser la ltima del procedimiento.

Ejemplo: lectores/escritores
public class Monitor { public int contador; public boolean escribe; public int cuenta; public Monitor(){ contador=0; escribe=false; } //entrada a la exclusin mutua (bloqueo exclusivo) public synchronized void entrar(){ try { if (escribe==true) wait(); //Ingresa lector contador++; } catch ( InterruptedException e){ System.out.println("No se pudo:"+e); } } //entrada a la exclusin mutua (bloqueo exclusivo)
public synchronized void salir(){ contador--; // Salio lector if (contador==0) notify(); } public synchronized void entraEscribir(){ try { if (contador>0) wait(); escribe=true; // Escritor: empieza a escribir } catch ( InterruptedException e){ System.out.println("No se pudo:"+e); } } public synchronized void saleEscribir(){ // Escritor: termina de escribir escribe=false; notifyAll(); } }

Hilo Lector
} } import java.lang.Thread; public class Lector extends Thread { Monitor mono; long tiempoDeEspera; //Monitor mono=new Monitor(); public Lector(Monitor mo, long tiempo) { mono=mo; tiempoDeEspera=tiempo; } public void run() { mono.entrar(); System.out.println("Entra Lector:"+getName()); try { sleep(tiempoDeEspera); } catch (InterruptedException e){ System.out.println("No pudo dormir:"+e); } mono.salir(); System.out.println("Sale Lector:"+getName());

El hilo Escritor
package escritores; import java.lang.Thread; public class Escritor extends Thread { Monitor mono; //Monitor mono=new Monitor(); public Escritor(Monitor mo) { mono=mo; } public void run() { mono.entraEscribir(); //aqui cominza la seccin_critica (bloqueo exclusivo) System.out.println("Entra:"+getName()); System.out.println(" E S C R I B E..... EN LA BD. "); //simulamos que tarda en escribir en la BD 10 seg. try { sleep(10000); } catch (InterruptedException e){ System.out.println("No pudo dormir :"+e); } System.out.println("Sale: "+getName()); //aqui termina la seccin_crtica (bloqueo exclusivo) mono.saleEscribir();

} }

La aplicacin
import java.io.*; public class Prueba { public static void main(String[] args) throws IOException{ /*Hilo1 hilo1=new Hilo1(); Hilo1 hilo2=new Hilo1(); hilo1.start(); hilo2.start(); */ //iniciamos el objeto monitor "mono" Monitor mono=new Monitor(); //iniciamos el objeto escritor "gabrielGarcia" Escritor gabrielGarcia=new Escritor(mono); gabrielGarcia.setName("ESCRITOR"); gabrielGarcia.start(); //iniciamos los lectores //el lector tardara en leer 5 segundos Lector lector1=new Lector(mono,5000); lector1.setName("I"); lector1.start(); //el lector tardara en leer 8 segundos Lector lector2=new Lector(mono,8000); lector2.setName("II"); lector2.start(); Lector lector3=new Lector(mono,10); lector3.setName("III"); lector3.start(); //Final del proceso Padre pulsa cualquier tecla System.in.read(); } }

You might also like