Semaforos en Java
Semaforos en Java
SINCRONIZACIN
sistema
se
pueden
clasificar
como
procesos
independientes o cooperantes.
Un proceso independiente es aquel que Ejecuta sin
requerir la ayuda o cooperacin de otros procesos.
Los procesos son cooperantes cuando estn diseados
para trabajar conjuntamente en alguna actividad, para lo
que deben ser capaces de comunicarse e interactuar
entre ellos.
Mecanismos de Comunicacin en
Programacin Concurrente
Los
Memoria Compartida
Si los diferentes procesos de un programa concurrente
Tipos de mecanismo
SEMFOROS
Operaciones soportadas:
(S): Si S>0 entonces S:=S- 1. En otro caso, la entidad
concurrente es suspendida sobre S, en una cola asociada.
Signal (S): Si hay una entidad concurrente suspendida se le
despierta. En otro caso S:=S+1.
Wait
Notacin:
Wait (S)=P(S)
Init(S,
inical al Signal (S)=V(S)
semaforo
valor).
Da
contador
valor
del
10
Generalidades
Wait y Signal son atmicas
El valor inicial de un semforo es no negativo
Signal despierta a algn proceso suspendido por
11
Implemetacin Semforos
Contador-integer
Cola-lista
Tipos de Semforos
Semforos binarios: Pueden tomar solo los valores 0 y 1.
Semforos general: Puede tomar cualquier valor Natural
(entero no negativo).
Semforo General
Un semforo general (contador) es un tipo de datos
Semforos y POO
En trminos de la orientacin a objetos un semforo S se crea
Semforo Binario
Un semforo binario slo puede tener valores de su
contador entre 0 y 1.
Cuando es iniciado con valor 1 permite resolver el
problema de la exclusin mutua:
propsitos:
Sincronizacin de exclusin mutua
Condicin de sincronizacin: bloquear a los hilos hasta que alguna
V(S);
Ejemplo P-C
variables compartidas por el consumidor y el productor
int N, contador = 0;
Semaphore S=0, mutex=1; //semforos binrios compartidos
productor()
{
Mientras (true)
{
produce_Elemento();
Si (contador == N) entonces
P(S); //delay
Introduce_en_buffer();
P(mutex);
contador++;
V(mutex);
Si (contador == 1)
V(S); //Despertar
}}
consumidor()
P(S); //solicita un recurso
{
Utiliza el recurso
Mientras(true)
V(S); //libera al recurso
{
Si (contador == 0
P(S); //delay
P(S) para solicitar una
Quita_Elemento();
unidad de recurso e
invoca a V(S) para
P(mutex);
regresar dicho recurso.
contador--;
V(mutex);
Si (contador == N-1)
V(S); //Despertar
Consume_Elemento();
}}
Seal
Listo
Suspendido
Dormido
semforos.
y La operacin de espera (wait) se usar como
procedimiento de bloqueo antes de acceder a una
seccin crtica y la operacin seal(signal) como
procedimiento de desbloqueo.
y Se utilizarn tantos semforos como clases de
secciones crticas se establezcan.
P1
wait (S) ;
Seccin Crtica
signal (S) ;
P2
wait (S) ;
Seccin Crtica
signal (S) ;
Ejemplo:
Procesos sincronizados mediante semforos
(* Sincronizacin con semforo*)
Procesos con semaforos
Mtodo de Sincronizacin;
var S: semaforo;
P1 (* Proceso que espera *)
Inicio_P1
wait(S);
....
Fin_P1
P2 (* Proceso que seala *)
Inicio_P1
....
signal(S);
....
Fin_P2;
Qu Proceso espera?
Qu Proceso Inicia?
Semforos en Java
Los semforos pueden implantarse a nivel del usuario
Semforos en Java
Por lo tanto, pueden verse como candados (locks) con 2
En un hilo 1:
P(S);
Wait()
En el otro Hilo2:
Signal(); V(S);
Clase
Semphore
class Semaphore
{
private int contador;
public Semaphore(int n) {
this.contador = n;
}
//metodo de espera o P()
public synchronized void WAIT()
{
while(contador == 0) {
try
{
wait();
}
catch (InterruptedException e) {
}
contador--;
}//fin de while
} //fin de WAIT
EJEMPLO DE HOLA
MUNDO
Establecer el semforo
Pre-Protocolo
Semaphoro(S).WAIT
Seccin Critica
Imprime Hilo el mensaje
Post-protocolo
Semaphoro(S).SIGNAL
Clase HolaMundo
public class HolaMundo extends
Thread {
//se crea el semaforo
static private Semaphore semaforo
= new Semaphore(1);
static private int COUNT=0;
String cadena;
public HolaMundo(String cad) {
cadena=cad;
}
P2 :
begin
a;
b;
c;
d;
end
end
P1 :
begin
a;
signal(s)
b;
end
c;
wait(s)
d;
end
P2 :
begin
c;
d;
end
P3 :
begin
e;
f;
end
P2 :
begin
P1 :
begin
c;
wait(s)
wait(s)
d;
a;
signal(s)
b;
end
P3 :
begin
e;
signal(s)
f;
end
end
hubiera ejecutado e.
La solucin correcta es utilizar dos semforos, s y t, uno entre P1y P2 y
otro entre P2 y P3
P2 :
begin
P1 :
begin
c;
wait(s)
wait(t)
d;
a;
signal(s)
b;
end
P3 :
begin
end
e;
signal(t)
f;
end
Semforos de sincronizacin
Un
S1;
signal (a);
signal (b);
P1
END;
BEGIN
P2
wait(a);
S2;
signal(c);
END;
P3
P4
BEGIN
wait(b);
S3;
signal(d);
END;
BEGIN
wait(c);
wait(d);
S4;
END;
COEND;
END;
Semforos Mutex
P2 :
begin
P1 :
begin
c;
wait(s)
wait(t)
d;
a;
signal(s)
b;
end
P3 :
begin
end
e;
signal(t)
f;
end
import java.io.*;
class Procesos2
{
protected static final
SemaforoBinario S = new
SemaforoBinario(0);
protected static final
SemaforoBinario T = new
SemaforoBinario(0);
protected static final
SemaforoBinario mutex = new
SemaforoBinario(1);
una B
P2, imprime B, despus imprime C, pero para imprimir C
tiene que esperar a que se imprima A y D
P3, imprime D, pero tiene que esperar a que se imprima
una B
a) Disee el grafo
b) Elabore la solucin con semforos en Java
try {
SA.WAIT();
mutex.WAIT();
System.out.println("Soy el proceso #1 y la instruccion A");
Thread.sleep(5000);
mutex.SIGNAL();
SC.SIGNAL();
mutex.SIGNAL();
} catch (InterruptedException e) {}
//
System.err.println("interrupted out of sleep");
}
}
import java.io.*;
class Procesos1
{
protected static final
SemaforoBinario SA = new
SemaforoBinario(0);
protected static final
SemaforoBinario SD = new
SemaforoBinario(0);
protected static final
SemaforoBinario SC = new
SemaforoBinario(0);
protected static final
SemaforoBinario mutex = new
SemaforoBinario(1);
EJERCICIOS
ENTREGA DE PROGRAMAS EN LABORATORIO
Practica individual
1.
2.
Grafo
Programa en Java
Actividad de Auto-aprendizaje
y Supongamos que tenemos 4 procesos (p1, p2, p3, p4), cada
P1
P3
Grafo de procedencia
P2
P4
Preguntas a resolver
1. Qu problemtica se resolvi a utilizar los
semforos?
2. Cuntos semforos se ocuparon, por qu?
3. Explica con tus propias palabras, la funcin
del semforo
52
Ejemplos
1. Supongamos que existen 4 montones de
53
En Grapar
Proceso 1: Amontonar
Var S:semaforo
Mesa: tipo L
Proceso Amontonar
Repetir
toma 1 hoja de cada montn
regin mesa hacer
deja el grupo de 4 hojas en la mesa
fin_regin
Signal (s)
Hasta que se acaban las hojas
Proceso 2: Grapar
Proceso Grapar
repetir
Wait(s)
regin mesa hacer
toma un grupo de la mesa y
otro de la grapa
fin_regin
54
programas
concurrentes
utilizando las
primitivas de Java
para sincronizar los
procesos.
2. Realizar los
programas
concurrentes
utilizando semforos
para sincronizar los
procesos.
Programa Grapar
Programa Bao
Programa del Puente
Programa Camiones
Programa de Tribu o
Canbales
6. Lectores y escritores
7. Filsofos Comensales
8. Productor Consumidor
9. Barbero Dormiln
10. Estacionamiento.
1.
2.
3.
4.
5.
Fecha: 4/octubre/2012