Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Clase Sincronizacion
Clase Sincronizacion
Oscar Bedoya
oscarbed@eisc.univalle.edu.co
* Sincronización de procesos
* Sección crítica
* Semáforos
* Sincronización en Java
Sincronización de procesos
cantidad
Cocinero 3 Mensajero
El proceso Mensajero
intenta tomar 2 pedidos. Si
solo hay 1 ó 0 espera hasta
que por lo menos hayan dos
Sincronización de procesos
run() run()
usa usa
Mesa Programa
int cantidad usa
Mesa mesa;
colocarPedido() Cocinero procesoCocinero;
atenderPedido() Mensajero procesoMensajero;
main()
public class Mesa{
int cantidad;
public Mesa(){
cantidad=0;
}
}
public class Mesa{
int cantidad;
• Cocinero y Mensajero comparten
la variable cantidad
public Mesa(){
cantidad=0;
}
}
public class Mesa{
1 cantidad 3
int cantidad;
public Mesa(){
cantidad=0;
}
}
public class Mesa{
1 cantidad 3
int cantidad;
public Mesa(){
cantidad=0;
}
}
1 cantidad 3
r1 r2 c
register1=cantidad
0 0 3
2 register1=register1+1
cantidad=register1
register2=cantidad
3 register2=register2-2
cantidad=register2
1 cantidad 3
r1 r2 c
register1=cantidad
3 0 3
2 register1=register1+1
cantidad=register1
register2=cantidad
3 register2=register2-2
cantidad=register2
1 cantidad 3
register1=cantidad
r1 r2 c
2 register1=register1+1
4 0 3
cantidad=register1
register2=cantidad
3 register2=register2-2
cantidad=register2
1 cantidad 3
register1=cantidad
r1 r2 c
2 register1=register1+1
4 0 4
cantidad=register1
register2=cantidad
3 register2=register2-2
cantidad=register2
1 cantidad 3
register1=cantidad
2 register1=register1+1
cantidad=register1
r1 r2 c
register2=cantidad
4 4 4
3 register2=register2-2
cantidad=register2
1 cantidad 3
register1=cantidad
2 register1=register1+1
cantidad=register1
register2=cantidad
r1 r2 c
3 register2=register2-2
4 2 4
cantidad=register2
1 cantidad 3
register1=cantidad
2 register1=register1+1
cantidad=register1
register2=cantidad
3 register2=register2-2 r1 r2 c
cantidad=register2 4 2 2
1 cantidad 3
register1=cantidad
2 register1=register1+1
cantidad=register1
register2=cantidad
3 register2=register2-2
cantidad=register2 cantidad 2
register1=cantidad register2=cantidad
2 register1=register1+1 3
register2=register2-2
cantidad=register1 cantidad=register2
1 cantidad 3
register1=cantidad
2 register1=register1+1 3
register2=cantidad
register2=register2-2
cantidad=register1
cantidad=register2
1 cantidad 3
r1 r2 c
register1=cantidad 3 0 3
2 register1=register1+1 3
register2=cantidad
register2=register2-2
cantidad=register1
cantidad=register2
1 cantidad 3
register1=cantidad r1 r2 c
2 register1=register1+1 4 0 3
register2=cantidad
register2=register2-2
cantidad=register1
cantidad=register2
1 cantidad 3
register1=cantidad
2 register1=register1+1 r1 r2 c
register2=cantidad
4 3 3
register2=register2-2
cantidad=register1
cantidad=register2
1 cantidad 3
register1=cantidad
2 register1=register1+1
register2=cantidad
r1 r2 c
register2=register2-2
4 1 3
cantidad=register1
cantidad=register2
1 cantidad 3
register1=cantidad
2 register1=register1+1
register2=cantidad
register2=register2-2 r1 r2 c
cantidad=register1 4 1 4
cantidad=register2
1 cantidad 3
register1=cantidad
2 register1=register1+1
register2=cantidad
register2=register2-2
cantidad=register1 r1 r2 c
cantidad=register2 4 1 1
1 cantidad 3
register1=cantidad
2 register1=register1+1
register2=cantidad
register2=register2-2
cantidad=register1
cantidad=register2
cantidad 1
1 cantidad 3
register1=cantidad
2 register1=register1+1
register2=cantidad
register2=register2-2
cantidad=register1
cantidad=register2
cantidad 1
El valor incorrecto para cantidad
se presenta porque se permite
que ambos hilos manipulen la
variable cantidad de manera
concurrente
1 cantidad 3
cantidad ?
Indique el valor de cantidad al
final de la ejecución
1 cantidad 3
cantidad 4
public class Mesa{
1 cantidad 3
int cantidad;
public Mesa(){
cantidad=0;
}
}
Sincronización de procesos
• La parte del código que no puede ser interrumpida por otro proceso
(p. ej modificar un registro, modificar una variable compartida) se
denomina sección crítica
• Cuando un hilo o proceso se ejecuta en su sección crítica, ningún
otro proceso puede acceder a la misma parte del código
Sincronización de procesos
Sincronización
Los algoritmos que se han propuesto para permitir sincronización
entre procesos se pueden clasificar en tres grupos:
1. Espera activa
2. Espera no activa*
3. Mecanismos hardware
public class Mesa{
int cantidad;
public Mesa(){
cantidad=0;
}
}
Sincronización de procesos
cantidad
Cocinero 3 Mensajero
atenderPedido()
colocarPedido()
Cocinero Mensajero
Mensajero
Cocinero
atenderPedido()
colocarPedido()
Sincronización de procesos
Semáforos
(Dijkstra 1965)
Sincronización de procesos
Dijkstra
(1930 – 2002)
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
Proceso 2
Proceso 5
S:3
Sincronización de procesos
pedir
Proceso 1 Proceso 3
Proceso 4
Proceso 2
Proceso 5
S:3
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
Proceso 2
Proceso 5
S:2
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
Proceso 2
pedir
Proceso 5
S:2
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
Proceso 2
Proceso 5
S:1
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
Proceso 2
devolver
Proceso 5
S:2
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
Proceso 2
pedir
Proceso 5
S:2
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
Proceso 2
Proceso 5
S:1
Sincronización de procesos
pedir
Proceso 1 Proceso 3
Proceso 4
Proceso 2
Proceso 5
S:1
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
Proceso 2
Proceso 5
S:0
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
pedir
Proceso 2
Proceso 5
El proceso 2 espera a
que alguien devuelva
un recurso
S:0
Sincronización de procesos
Proceso 1 Proceso 3
pedir
Proceso 4
pedir
Proceso 2
Proceso 5
El proceso 2 espera a
que alguien devuelva El proceso 4 espera a
un recurso que alguien devuelva un
recurso
S:0
Sincronización de procesos
Proceso 1 Proceso 3
pedir
Proceso 4
pedir
Proceso 2
Proceso 5
P()
Proceso 1 Proceso 3
Proceso 4
Proceso 2
Proceso 5
S:2
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
Proceso 2
Proceso 5
S:1
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
Proceso 2
V()
Proceso 5
S:2
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
P()
Proceso 2
Proceso 5
S:0
Sincronización de procesos
Semaforo
int valor;
P()
V()
public class Semaforo{
int valor;
En el constructor se indica
public Semaforo(int v){ la cantidad de recursos
iniciales del semáforo
valor = v;
}
}
}
Sincronización de procesos
Proceso 1 Proceso 3
Recurso
Recurso Proceso 4
Proceso 2 Recurso
Proceso 5
semáforo1: 3
Sincronización de procesos
Proceso 1 Proceso 3
Recurso
Recurso Proceso 4
Proceso 2 Recurso
Proceso 5
semáforo1: 3
Proceso 1 Proceso 3
Recurso
Recurso Proceso 4
Proceso 2 Recurso
Proceso 5
semáforo1: 3
semaforo1.P();
Proceso 1 Proceso 3
Recurso
Recurso Proceso 4
Proceso 2 Recurso
Proceso 5
semáforo1: 3
Recurso
Recurso Proceso 4
Proceso 2
Proceso 5
semáforo1: 2
Sincronización de procesos
semaforo1.V();
Recurso
Recurso Proceso 4
Proceso 2
Proceso 5
semáforo1: 2
Proceso 1 Proceso 3
Recurso
Recurso Proceso 4
Proceso 2 Recurso
Proceso 5
semáforo1: 3
Proceso1: Proceso2: Proceso3:
public void run(){ public void run(){ public void run(){
... ... semaforo.P();
semaforo.P(); ... imprime(“1”)
imprime(“a”); semaforo.P(); imprime(“2”)
imprime(“b”); imprime(“I”) imprime(“3”)
imprime(“c”); imprime(“II”) imprime(“4”)
imprime(“d”); imprime(“III”) semaforo.V();
imprime(“e”); imprime(“IV”) }
imprime(“f”); semaforo.V();
imprime(“g”); }
imprime(“h”);
semaforo.V();
}
Semáforos
Existen dos tipos de semáforos:
• Semáforo binario (mutex)
• Semáforo de conteo
Sincronización de procesos
Proceso 1 Proceso 3
Proceso 4
Proceso 2
Proceso 5
1
public Mesa(){
cantidad=0;
}
}
Sincronización de procesos
Semáforos de conteo
Permite sincronizar el uso de n recursos por cualquier cantidad de
procesos
Semáforos
• Suponga que tiene tres impresoras y dos lectores de CD para
sincronizar, cuántos semáforos necesita?
Sincronización de procesos
cantidadPedidos
Cocinero 3 Mensajero
cantidadPedidos
Cocinero 3 Mensajero
atenderPedido()
Mensajero
Mensajero
atenderPedido()
Sincronización de procesos
run() run()
usa usa
Mesa Programa
int cantidadPedidos usa
Mesa mesa;
colocarPedido() Cocinero c1;
atenderPedido() Mensajero m1;
main()
Sincronización de procesos
Mesa Programa
int cantidadPedidos usa
Mesa mesa;
colocarPedido() Cocinero c1;
atenderPedido() Mensajero m1,m2,m3;
main()
public class Mesa{
int cantidadPedidos;
public Mesa(){
cantidadPedidos=0;
}
}
public class Mesa{
int cantidadPedidos;
public Mesa(){
cantidadPedidos=0;
}
}
Sincronización de procesos
cantidadPedidos
Cocinero 3 Mensajero
atenderPedido()
Mensajero
cantidadPedidos
Cocinero 3 Mensajero
atenderPedido()
Mensajero
Mensajero
atenderPedido()
cantidadPedidos
Cocinero 3 Mensajero
atenderPedido()
Mensajero
public Mesa(){
cantidadPedidos=0;
}
}
public class Mesa{
int cantidadPedidos;
Semaforo cajasDisponibles=new Semaforo(0);
public Mesa(){
cantidadPedidos=0;
}
}
public class Mesa{
int cantidadPedidos;
Semaforo cajasDisponibles=new Semaforo(0);
public Mesa(){
cantidadPedidos=0;
}
}
public class Mesa{
int cantidadPedidos;
Semaforo cajasDisponibles=new Semaforo(0);
public Mesa(){
cantidadPedidos=0;
}
¿Dónde se hace
public void colocarPedido(){
cantidadPedidos = cantidadPedidos+1;
cajasDisponibles.V()?
}
}
public class Mesa{
int cantidadPedidos;
Semaforo cajasDisponibles=new Semaforo(0);
public Mesa(){
cantidadPedidos=0;
}
}
public class Mesa{
int cantidadPedidos;
Semaforo cajasDisponibles=new Semaforo(0);
public Mesa(){
cantidadPedidos=0;
}
Suponga que quisiera
public void colocarPedido(){
asegurar que solo un hilo al
cantidadPedidos = cantidadPedidos+1; tiempo esté modificando la
cajasDisponibles.V(); variable cantidadPedidos,
} ¿cómo lo hace?
public void atenderPedido(){
cajasDisponibles.P();
cajasDisponibles.P();
cantidadPedidos = cantidadPedidos-2;
}
}
Proceso1: Proceso2:
public void run(){ public void run(){
... ...
mutex.P(); mutex.P();
cantidad=cantidad+1; cantidad=cantidad-5;
mutex.V(); mutex.V();
} }
public Mesa(){
cantidadPedidos=0;
}
}
public class Mesa{
int cantidadPedidos;
Semaforo cajasDisponibles=new Semaforo(0);
Semaforo mutex=new Semaforo(1);
public Mesa(){
cantidadPedidos=0;
}
public void colocarPedido(){
mutex.P();
cantidadPedidos = cantidadPedidos+1;
mutex.V();
cajasDisponibles.V();
}
public void atenderPedido(){
cajasDisponibles.P();
cajasDisponibles.P();
mutex.P();
cantidadPedidos = cantidadPedidos-2;
mutex.V();
}
}
public class Mesa{
int cantidadPedidos;
Semaforo cajasDisponibles=new Semaforo(0);
Semaforo mutex=new Semaforo(1);
public Mesa(){
cantidadPedidos=0;
}
public void colocarPedido(){
Suponga que inicia el
mutex.P();
programa y el cocinero se
cantidadPedidos = cantidadPedidos+1;
queda dormido, ¿dónde
mutex.V();
espera el mensajero?
cajasDisponibles.V();
}
public void atenderPedido(){
cajasDisponibles.P();
cajasDisponibles.P();
mutex.P();
cantidadPedidos = cantidadPedidos-2;
mutex.V();
}
}
Sincronización de procesos
cantidadPedidos
Cocinero 3 Mensajero
atenderPedido()
Mensajero
Mensajero
atenderPedido()
Son 3 mensajeros
Sincronización de procesos
Mesa Programa
int cantidadPedidos usa
Mesa mesa;
colocarPedido() Cocinero c1;
atenderPedido() Mensajero m1,m2,m3;
main()
Sincronización de procesos
cantidadNaranjas
Reoolector 3 Comensal
bajarNaranja()
Reoolector
bajarNaranja() • Un recolector siempre baja de a una
Reoolector naranja
• El comensal come de a una naranja y
espera si no hay
Sincronización de procesos
Canasto Programa
int cantidadNaranjas; usa
Canasto canasto;
bajarNaranja() Comensal c1;
comerNaranja() Recolector r1,r2,r3;
main()
public class Canasto{
int cantidadNaranjas;
public Canasto(){
cantidadNaranjas=0;
}
}
public void comerNaranja(){
}
}
Sincronización de procesos
cantidadNaranjas
Reoolector 3 Comensal
bajarNaranja()
Reoolector
bajarNaranja()
Reoolector
cantidadNaranjas
Reoolector 3 Comensal
bajarNaranja()
Reoolector
bajarNaranja()
Reoolector
Semaforo naranjasDisponibles=new Semaforo(0);
Sincronización de procesos
cantidadNaranjas
Reoolector 3 Comensal
bajarNaranja()
Reoolector
bajarNaranja()
Reoolector
Semaforo naranjasDisponibles=new Semaforo(0);
Recolector
colocarDulce()
Recolector
run() run()
usa usa
Mesa Programa
int cantidadDulces; usa
Mesa mesa;
colocarDulce() Recolector procesoRecolector;
tomarDulce() Gloton procesoGloton;
main()
Sincronización de procesos
Mesa Programa
int cantidadDulces; usa
Mesa mesa;
colocarDulce() Recolector r1,r2,r3;
tomarDulce() Gloton g1;
main()
Sincronización de procesos
Recolector
colocarDulce()
Recolector
Recolector
colocarDulce()
Recolector
Recolector
colocarDulce()
Recolector
Recolector
colocarDulce()
Recolector
Recolector
colocarDulce()
Recolector
Recolector
colocarDulce()
Recolector
public Mesa(){
cantidadDulces=0;
}
public Mesa(){
cantidadDulces=0;
}
public Mesa(){
cantidadDulces=0;
}
public Mesa(){
cantidadDulces=0;
}
public Mesa(){
cantidadDulces=0;
}
public Mesa(){
cantidadDulces=0;
}
public Mesa(){
cantidadDulces=0;
}
public Mesa(){
cantidadDulces=0;
}
public void colocarDulce(){
espaciosDisponibles.P();
mutex.P();
cantidadDulces=cantidadDulces+1;
mutex.V();
dulcesDisponibles.V();
}
public void tomarDulce(){
dulcesDisponibles.P();
mutex.P();
cantidadDulces=cantidadDulces-1;
mutex.V();
}
}
public class Mesa{
int cantidadDulces;
Semaforo mutex=new Semaforo(1);
Semaforo dulcesDisponibles=new Semaforo(0);
Semaforo espaciosDisponibles=new Semaforo(10);
public Mesa(){
cantidadDulces=0;
}
public void colocarDulce(){
espaciosDisponibles.P();
mutex.P();
cantidadDulces=cantidadDulces+1;
mutex.V();
dulcesDisponibles.V();
}
public void tomarDulce(){
dulcesDisponibles.P();
mutex.P();
cantidadDulces=cantidadDulces-1;
mutex.V();
espaciosDisponibles.V();
}
}
public class Mesa{
int cantidadDulces;
Semaforo mutex=new Semaforo(1);
Semaforo dulcesDisponibles=new Semaforo(0);
Semaforo espaciosDisponibles=new Semaforo(10);
public Mesa(){
cantidadDulces=0; Suponga que inicia el programa y
} los recolectores duermen, ¿dónde
public void colocarDulce(){ espera el glotón?
espaciosDisponibles.P();
mutex.P();
cantidadDulces=cantidadDulces+1;
Suponga que los recolectores
mutex.V();
colocan 10 dulces y el glotón
dulcesDisponibles.V(); duerme, si llega otro recolector
} con un dulce más, ¿dónde espera?
public void tomarDulce(){
dulcesDisponibles.P();
mutex.P();
cantidadDulces=cantidadDulces-1;
mutex.V();
espaciosDisponibles.V();
}
}
Sincronización de procesos
tomar()
Cartero
Estante Programa
int cantidadCartas; usa
Estante estante;
colocar() Administrador a1;
retirar() Cartero c1,c2,c3;
main()
public class Estante{
int cantidadCartas;
public Estante(){
cantidadCartas=0;
}
tomar()
Cartero
tomar()
Cartero
tomar()
Cartero
tomar()
Cartero
public Estante(){
cantidadCartas=0;
}
public void colocar(){
cantidadCartas=cantidadCartas+4;
}
public void tomar(){
cantidadCartas=cantidadCartas-2;
}
}
public class Estante{
int cantidadCartas;
Semaforo cartasDisponibles=new Semaforo(0);
Semaforo espaciosDisponibles=new Semaforo(50);
Semaforo mutex=new Semaforo(0);
public Estante(){
cantidadCartas=0;
}
public void colocar(){
mutex.P();
cantidadCartas=cantidadCartas+4;
mutex.V();
}
public void tomar(){
mutex.P();
cantidadCartas=cantidadCartas-2;
mutex.V();
}
}
public class Estante{
int cantidadCartas;
Semaforo cartasDisponibles=new Semaforo(0);
Semaforo espaciosDisponibles=new Semaforo(50);
Semaforo mutex=new Semaforo(0);
public Estante(){
cantidadCartas=0;
}
public void colocar(){
mutex.P();
cantidadCartas=cantidadCartas+4;
mutex.V();
}
public void tomar(){
mutex.P();
cantidadCartas=cantidadCartas-2;
mutex.V();
}
}
public class Estante{
int cantidadCartas;
Semaforo cartasDisponibles=new Semaforo(0);
Semaforo espaciosDisponibles=new Semaforo(50);
Semaforo mutex=new Semaforo(0);
public Estante(){
cantidadCartas=0;
}
public void colocar(){
mutex.P();
cantidadCartas=cantidadCartas+4;
mutex.V();
}
public void tomar(){
cartasDisponibles.P();
mutex.P();
cantidadCartas=cantidadCartas-2;
mutex.V();
}
}
public class Estante{
int cantidadCartas;
Semaforo cartasDisponibles=new Semaforo(0);
Semaforo espaciosDisponibles=new Semaforo(50);
Semaforo mutex=new Semaforo(0);
public Estante(){
cantidadCartas=0;
}
public void colocar(){
mutex.P();
cantidadCartas=cantidadCartas+4;
mutex.V();
}
public void tomar(){
cartasDisponibles.P();
cartasDisponibles.P();
mutex.P();
cantidadCartas=cantidadCartas-2;
mutex.V();
}
public class Estante{
int cantidadCartas;
Semaforo cartasDisponibles=new Semaforo(0), Semaforo espaciosDisponibles=new Semaforo(50
Semaforo mutex=new Semaforo(0);
public Estante(){
cantidadCartas=0;}
public void colocar(){
mutex.P();
cantidadCartas=cantidadCartas+4;
mutex.V();
cartasDisponibles.V();
cartasDisponibles.V();
cartasDisponibles.V();
cartasDisponibles.V();
}
public void tomar(){
cartasDisponibles.P();
cartasDisponibles.P();
mutex.P();
cantidadCartas=cantidadCartas-2;
mutex.V();
public class Estante{
int cantidadCartas;
Semaforo cartasDisponibles=new Semaforo(0), Semaforo espaciosDisponibles=new Semaforo(50
Semaforo mutex=new Semaforo(0);
public Estante(){
cantidadCartas=0;}
public void colocar(){
mutex.P();
cantidadCartas=cantidadCartas+4;
mutex.V();
cartasDisponibles.V();
cartasDisponibles.V();
cartasDisponibles.V();
cartasDisponibles.V();
}
public void tomar(){
cartasDisponibles.P();
cartasDisponibles.P();
mutex.P();
cantidadCartas=cantidadCartas-2;
mutex.V();
public void colocar(){
espaciosDisponibles.P();
espaciosDisponibles.P();
espaciosDisponibles.P();
espaciosDisponibles.P();
mutex.P();
cantidadCartas=cantidadCartas+4;
mutex.V();
cartasDisponibles.V();
cartasDisponibles.V();
cartasDisponibles.V();
cartasDisponibles.V();
}
public void tomar(){
cartasDisponibles.P();
cartasDisponibles.P();
mutex.P();
cantidadCartas=cantidadCartas-2;
mutex.V();
espaciosDisponibles.V();
espaciosDisponibles.V();
Sincronización de procesos
Escritor Lector
BD
Lector
Lector
Sincronización de procesos
Escritor Lector
BD
endRead()
Sincronización de procesos
startWrite()
Escritor Lector
BD
endWrite()
Sincronización de procesos
Escritor Lector
BD
endRead()
Sincronización de procesos
startWrite() startRead()
Escritor Lector
BD
Sincronización de procesos
startWrite() startRead()
readerCount=2
Escritor Lector
BD
startRead()
Lector
Sincronización de procesos
startWrite() startRead()
readerCount=1
Escritor Lector
BD
endRead()
startRead()
Lector
Sincronización de procesos
startWrite()
readerCount=0
Escritor
BD
endRead()
startRead()
Lector
Sincronización de procesos
startWrite()
readerCount=0
Escritor
BD
Sincronización de procesos
startWrite()
readerCount=0
Escritor
BD
endWrite()
Sincronización de procesos
startWrite() startRead()
Escritor Lector
BD
endWrite() endRead()
Database Test
int readerCount; usa
Database database;
startRead() Writer e1;
endRead() Reader r1,r2,r3;
startWrite() main()
endWrite()
Sincronización de procesos
startWrite() startRead()
Escritor Lector
BD
endWrite() endRead()
public Database(){
readerCount=0;
}
Lector
endRead()
readerCount BD
Sincronización de procesos
Lector
readerCount endRead()
BD readerCount-1
Sincronización de procesos
Lector
readerCount endRead()
BD readerCount-1
startRead()
readerCount+1
Lector
endRead()
readerCount-1
public class Database{
int readerCount;
public Database(){
readerCount=0;
}
Lector
Escritor BD
Lector
Escritor BD
semaforoBD:1
Sincronización de procesos
Escritor Lector
BD
semaforoBD:1
Sincronización de procesos
Escritor Lector
readerCount (1) BD
semaforoBD:0
Sincronización de procesos
Escritor Lector
BD
El escritor debe
esperar hasta que se
semaforoBD:0
libere el recurso
Sincronización de procesos
Escritor Lector
readerCount (1) BD
semaforoBD:0
Sincronización de procesos
Escritor Lector
startRead()
readerCount (1) BD
Lector
semaforoBD:0
Escritor Lector
startRead()
readerCount (2) BD
Lector
semaforoBD:0
Escritor Lector
startRead()
readerCount (2) BD
Lector
semaforoBD:0
Escritor Lector
endRead()
readerCount (2) BD
startRead() Lector
semaforoBD:0
Sincronización de procesos
Escritor
readerCount (1) BD
startRead() Lector
semaforoBD:0
Sincronización de procesos
Escritor
startRead()
readerCount (1) BD
Lector
semaforoBD:0
endRead()
Sincronización de procesos
Escritor
startRead()
readerCount (0) BD
Lector
semaforoBD:1
endRead()
Sincronización de procesos
readerCount=readerCount+1; readerCount=readerCount-1;
if (readerCount==1) mutex.V();
db.P(); }
mutex.V();
}
• db es un semáforo que controla el acceso a BD
Semaforo db=new Semaforo(1);
• Inicialmente es 1
• Cada vez que se desee escribir se hace P(), también si es el primer lector
• Se hace V() cuando un escritor termina o cuando sale el ultimo de los
lectores
readerCount=readerCount+1; readerCount=readerCount-1;
if (readerCount==1) mutex.V();
db.P(); if (readerCount==0)
mutex.V(); db.V();
} }
• db es un semáforo que controla el acceso a BD
Semaforo db=new Semaforo(1);
• Inicialmente es 1
• Cada vez que se desee escribir se hace P(), también si es el primer lector
• Se hace V() cuando un escritor termina o cuando sale el ultimo de los
lectores
readerCount=readerCount+1; readerCount=readerCount-1;
if (readerCount==1) mutex.V();
db.P(); if (readerCount==0)
mutex.V(); db.V();
} }
} }
• db es un semáforo que controla el acceso a BD
Semaforo db=new Semaforo(1);
• Inicialmente es 1
• Cada vez que se desee escribir se hace P(), también si es el primer lector
• Se hace V() cuando un escritor termina o cuando sale el ultimo de los
lectores
readerCount=readerCount+1; readerCount=readerCount-1;
if (readerCount==1) mutex.V();
db.P(); if (readerCount==0)
mutex.V(); db.V();
} }
readerCount=readerCount+1; readerCount=readerCount-1;
if (readerCount==1) mutex.V();
db.P(); if (readerCount==0)
mutex.V(); db.V();
} }
readerCount=readerCount+1; readerCount=readerCount-1;
if (readerCount==1) mutex.V();
db.P(); if (readerCount==0)
mutex.V(); db.V();
} }