Sincronización entre procesos

Anuncio
Sincronización entre procesos
Federico Raimondo
SO
10/09/2013
Federico Raimondo
Sincronización entre procesos
10/09/2013
1 / 15
Repaso
Mutex
Mutual Exclusion (Mutex o Exclusión Mutua)
Lograr el acceso exclusivo a una variable o porción de código.
Federico Raimondo
Sincronización entre procesos
10/09/2013
2 / 15
Repaso
Mutex
Mutual Exclusion (Mutex o Exclusión Mutua)
int critica = 3.1416
A():
while(true):
agregar_decimal(critica)
B():
while(true):
quitar_decimal(critica)
¿cómo hacemos para que agregar decimal y quitar decimal se
ejecuten sin “molestarse”?
Federico Raimondo
Sincronización entre procesos
10/09/2013
3 / 15
Repaso
Mutex
Mutual Exclusion (Mutex o Exclusión Mutua)
int critica = 3.1416
sem_t m(1);
A():
while(true):
m.wait()
agregar_decimal(critica)
m.signal()
B():
while(true):
m.wait()
quitar_decimal(critica)
m.signal()
Federico Raimondo
Sincronización entre procesos
10/09/2013
4 / 15
Repaso
Rendezvouz
Rendezvous
Federico Raimondo
Sincronización entre procesos
10/09/2013
5 / 15
Repaso
Rendezvouz
Rendezvous (Encuentro)
Dados dos procesos A y B, logra que ambos se encuentren en determinado
punto del código antes de seguir ejecutando.
Federico Raimondo
Sincronización entre procesos
10/09/2013
5 / 15
Repaso
Rendezvouz
Rendezvous (Encuentro)
A():
f1()
g1()
B():
f2()
g2()
¿cómo hacemos para que g1 y g2
se ejecuten luego de que lo hagan f1 y f2?
Federico Raimondo
Sincronización entre procesos
10/09/2013
6 / 15
Repaso
Rendezvouz
Rendezvous (Encuentro)
A():
f1()
b.signal()
a.wait()
g1()
Federico Raimondo
B():
f2()
a.signal()
b.wait()
g2()
Sincronización entre procesos
10/09/2013
7 / 15
Repaso
Barrera
Barrera
Es la idea de Rendezvous extendida a N procesos.
Federico Raimondo
Sincronización entre procesos
10/09/2013
8 / 15
Repaso
Barrera
Barrera
Ai():
f()
g()
¿cómo hacemos para que todos los procesos ejecuten g() una vez que
todos hayan ejecutado f()?
Federico Raimondo
Sincronización entre procesos
10/09/2013
9 / 15
Repaso
Barrera
Barrera
int n = N
sem m = mutex(1)
sem b = sem(0)
P(i):
f()
m.wait() //Acceso exclusivo
n--;
yo = n;
m.signal()
if yo == 0: // Soy el ultimo
b.signal()
b.wait()
b.signal() // <- wait+signal = turnstile
g()
Federico Raimondo
Sincronización entre procesos
10/09/2013
10 / 15
Repaso
Barrera
Barrera
int n = N
sem m = mutex(1)
sem b = sem(0)
P(i):
f()
m.wait() //Acceso exclusivo
n--;
yo = n;
m.signal()
if yo == 0: // Soy el ultimo
b.signal()
b.wait()
b.signal() // <- wait+signal = turnstile
g()
¡Ojo con el orden!
Federico Raimondo
Sincronización entre procesos
10/09/2013
10 / 15
Repaso
Barrera
Barrera
int n = N
sem m = mutex(1)
sem b = sem(0)
P(i):
f()
m.wait() //Acceso exclusivo
n--;
yo = n;
m.signal()
if yo == 0: // Soy el ultimo
b.signal(N) // broadcast
b.wait()
g()
Federico Raimondo
Sincronización entre procesos
10/09/2013
11 / 15
Repaso
Cola ordenada
Cola ordenada
Los procesos deben acceder a la sección critica en orden.
Federico Raimondo
Sincronización entre procesos
10/09/2013
12 / 15
Repaso
Cola ordenada
Cola ordenada
P(i):
f() //<-- Seccion critica
Q():
while(true)
g()
// <-- Aca corren los P en orden.
¿cómo hacemos para que los procesos P ejecuten f() en el orden en que
llegaron, luego de que Q ejecute g()?
Federico Raimondo
Sincronización entre procesos
10/09/2013
13 / 15
Repaso
Cola ordenada
Cola ordenada
cola c = colaVacia()
sem_t m = mutex(1)
semt_t c = colaNoVacia(0)
P(i):
sem yo = sem(0)
m.wait()
n = tamanio(c)
c.push(yo)
m.signal()
if (n == 0)
colaNoVacia.signal()
yo.wait()
f()
m.wait()
c.pop()
if c no es vacia:
c.top().signal()
m.signal()
Federico Raimondo
Sincronización entre procesos
10/09/2013
14 / 15
Repaso
Cola ordenada
Cola desordenada
Q():
while(true)
g()
colaNoVacia.wait()
m.wait()
c.top().signal()
m.signal()
Federico Raimondo
Sincronización entre procesos
10/09/2013
15 / 15
Descargar