Professional Documents
Culture Documents
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusion mutua
Gustavo Romero
Arquitectura y Tecnologa de Computadores
10 de febrero de 2016
c Gustavo Romero
Exclusi
on mutua (1/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Indice
1
2
3
Introduccion
Usuario
Hardware
Cerrojos
Gestion de interrupciones
Instrucciones especiales
c Gustavo Romero
5
6
N
ucleo
Semaforos
Monitores
Variables condicion
Problemas
Pthreads
Exclusi
on mutua (2/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Lecturas recomendadas
J.Bacon
A. Silberschatz
W. Stallings
A. Tanuenbaum
c Gustavo Romero
Exclusi
on mutua (3/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Introduccion
c Gustavo Romero
Exclusi
on mutua (4/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
c Gustavo Romero
Exclusi
on mutua (5/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusi
on mutua (6/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
c Gustavo Romero
Exclusi
on mutua (7/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
// patr
on de comportamiento
// habitual de una hebra que
// ejecuta una secci
on cr
tica
while(true)
{
entrar secci
on_cr
tica
secci
on_cr
tica
salir secci
on_cr
tica
secci
on_no_cr
tica
}
c Gustavo Romero
Exclusi
on mutua (8/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Ejecuci
on de secciones crticas mediante exclusi
on mutua.
c Gustavo Romero
Exclusi
on mutua (9/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
196x
1974
1981
Algoritmo de Peterson.
2008
Exclusi
on mutua (10/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
c Gustavo Romero
Exclusi
on mutua (11/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusividad:
Como maximo una hebra puede entrar en su seccion crtica.
Progreso:
Ninguna hebra fuera de su seccion crtica puede impedir que
otra entre en la suya.
Portabilidad:
El funcionamiento correcto no puede basarse en...
la velocidad de ejecuci
on.
el n
umero o tipo de los procesadores.
la poltica de planificaci
on del SO.
c Gustavo Romero
Exclusi
on mutua (12/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusividad:
Si no se cumple la solucion es incorrecta.
Progreso:
Los protocolos mas sencillos a veces violan este requisito.
Portabilidad:
Algunas soluciones dependen de...
el n
umero o tipo de los procesadores.
la poltica de planificaci
on del SO.
c Gustavo Romero
Exclusi
on mutua (13/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Justicia:
Si varias hebras esperan para entrar en su seccion crtica
deberamos permitir que todas entrasen con parecida
frecuencia.
Escalabilidad:
Debe funcionar igual de bien para cualquier n
umero de hebras.
Simplicidad:
Deben ser faciles de usar el esfuerzo de programaci
on
debe ser lo mas peque
no posible.
c Gustavo Romero
Exclusi
on mutua (14/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Usuario
c Gustavo Romero
Exclusi
on mutua (15/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusi
on mutua (16/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Hebra 1
while(true)
{
while (turno != 1);
secci
on cr
tica();
turno = 1;
secci
on cr
tica();
turno = 0;
secci
on no cr
tica();
}
secci
on no cr
tica();
}
Exclusi
on mutua (17/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusi
on mutua (18/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusi
on mutua (19/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
cumple
exclusividad
si
progreso
no
espera acotada
si
portabilidad
no
eficiencia
no
escalabilidad
no
motivo
debido a turno solo una hebra entra en su seccion crtica
alternancia estricta, ademas el
tama
no de la seccion no crtica
afecta a la otra hebra
espera igual al tiempo de ejecuci
on de la otra seccion crtica
1 procesador + prioridad estatica
= circulo vicioso
espera ocupada
el problema se acent
ua al aumentar el n
umero de hebras
Exclusi
on mutua (20/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Algoritmo 2
c Gustavo Romero
Exclusi
on mutua (21/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Algoritmo 2
variables compartidas
bool bandera[2] = {false, false};
hebrai
while (true)
{
while (bandera[j]);
bandera[i] = true;
secci
on cr
tica();
bandera[i] = false;
secci
on no cr
tica();
}
c Gustavo Romero
Necesitamos una
variable logica por cada
hebra.
Hi muestra su deseo de
entrar en su seccion
crtica haciendo
bandera[i] = true
No satisface el requisito
de exclusividad.
Satisface el requisito de
progreso.
Exclusi
on mutua (22/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
cumple
motivo
exclusividad
no
progreso
si
espera acotada
si
portabilidad
no
eficiencia
no
escalabilidad
no
Exclusi
on mutua (23/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Algoritmo 3
variables compartidas
bool bandera[2] = {false, false};
hebrai
while (true)
{
bandera[i] = true;
while (bandera[j]);
secci
on cr
tica();
bandera[i] = false;
secci
on no cr
tica();
}
c Gustavo Romero
Necesitamos una
variable logica por cada
hebra.
Hi muestra su deseo de
entrar en su seccion
crtica haciendo
bandera[i] = true
Satisface el requisito de
exclusividad.
Satisface el requisito de
progreso.
Exclusi
on mutua (24/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Algoritmo 3: es correcto?
Imaginemos la siguiente secuencia de ejecucion:
H0 : bandera[0] = true;
H1 : bandera[1] = true;
Que pasara?
Ambas hebras esperaran para siempre y ninguna
podra entrar en su seccion crtica =
interbloqueo.
c Gustavo Romero
Exclusi
on mutua (25/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
cumple
motivo
exclusividad
si
progreso
si
espera acotada
no
portabilidad
no
eficiencia
no
escalabilidad
no
interbloqueo en el protocolo de
entrada
Exclusi
on mutua (26/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Algoritmo 4
c Gustavo Romero
Exclusi
on mutua (27/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Algoritmo 4
variables compartidas
bool bandera[2] = {false, false};
hebrai
while (true)
{
bandera[i] = true;
while (bandera[j]) {
bandera[i] = false;
// retardo
bandera[i] = true;
};
secci
on cr
tica();
bandera[i] = false;
secci
on no cr
tica();
}
c Gustavo Romero
bandera expresa el
deseo de entrar en la
seccion crtica.
Hi hace bandera[i] =
true pero
esta dispuesta a dar
marcha atras.
Satisface el requisito de
exclusividad.
Satisface el requisito de
progreso.
No satisface el requisito
de espera acotada.
Exclusi
on mutua (28/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
cumple
motivo
exclusividad
si
progreso
si
espera acotada
no
portabilidad
no
eficiencia
no
escalabilidad
no
empeora con el n
umero de hebras
y requiere recodificacion
Exclusi
on mutua (29/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Algoritmo de Dekker
variables compartidas
hebrai
while (true)
{
bandera[i] = true;
while (bandera[j]) {
if (turno == j) {
bandera[i] = false;
while (turno == j);
bandera[i] = true;
}
}
bandera expresa la
intencion de entrar en la
seccion crtica.
turno indica cual es la
hebra preferida en caso de
empate.
Hi hace bandera[i] =
true pero esta dispuesta a
dar marcha atras con la
ayuda de turno.
c Gustavo Romero
secci
on cr
tica();
turno = j;
bandera[i] = false;
secci
on no cr
tica();
}
Exclusi
on mutua (30/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
cumple
motivo
exclusividad
si
progreso
si
espera acotada
si
portabilidad
no
eficiencia
no
escalabilidad
no
empeora con el n
umero de hebras
y requiere recodificacion
Exclusi
on mutua (31/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Algoritmo de Peterson
variables compartidas
bool bandera[2] = {false, false};
int turno = 0; // desempate
La hebra i muestra su
deseo de entrar en su
seccion crtica haciendo
bandera[i] = true.
hebrai
while (true)
{
bandera[i] = true;
turno = j;
while (bandera[j] && turno == j);
secci
on cr
tica();
bandera[i] = false;
secci
on no cr
tica();
}
c Gustavo Romero
En comparacion con el
algoritmo de Dekker es
mas eficiente, mas simple
y extensible a mas de 2
hebras.
Exclusi
on mutua (32/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusi
on mutua (33/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
cumple
motivo
exclusividad
si
progreso
si
espera acotada
si
portabilidad
no
eficiencia
no
espera ocupada
escalabilidad
si
Exclusi
on mutua (34/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusi
on mutua (35/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusi
on mutua (36/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
c Gustavo Romero
Exclusi
on mutua (37/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusi
on mutua (38/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Hardware
c Gustavo Romero
Exclusi
on mutua (39/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Exclusi
on mutua (40/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
c Gustavo Romero
Exclusi
on mutua (41/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Hebra 2
cerrojo.adquirir();
saldo = conseguir saldo(cuenta);
saldo = saldo - cantidad;
cerrojo.adquirir();
almacenar saldo(cuenta, saldo);
cerrojo.liberar();
saldo = conseguir saldo(cuenta);
saldo = saldo - cantidad;
almacenar saldo(cuenta, saldo);
return saldo;
cerrojo.liberar();
return saldo;
c Gustavo Romero
Exclusi
on mutua (42/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
}
void liberar()
{
cerrado = false; // abrir
}
private:
volatile bool cerrado;
};
1
condici
on de carrera
c Gustavo Romero
Exclusi
on mutua (43/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Exclusi
on mutua (44/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
cli/sti
Instrucciones at
omicas:
Existen instrucciones para las que el procesador y el bus
garantizan su ejecucion at
omica.
TAS
FAA
CAS
LL/SC
c Gustavo Romero
Exclusi
on mutua (45/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Exclusi
on mutua (46/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Se preserva la exclusi
on mutua pero
se degrada la eficiencia del sistema:
mientras esta en la seccion crtica no
se atenderan interrupciones.
hebrai
while(true)
{
deshabilitar interrupciones();
secci
on cr
tica();
habilitar interrupciones();
secci
on no cr
tica();
}
c Gustavo Romero
Exclusi
on mutua (47/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Multiprocesador:
No es efectivo en absoluto porque...
Aunque las deshabilitasemos en todos los procesadores no
arregla nada porque...
Varios procesadores podra acceder a la vez a un mismo
recurso no garantiza la exclusion mutua.
En resumen:
Los efectos laterales son inaceptables en general.
La buena noticia es que esta operacion es privilegiada :)
c Gustavo Romero
Exclusi
on mutua (48/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
variable compartida
cerrojo_t cerrojo;
hebrai
while(true)
{
cerrojo.adquirir();
secci
on cr
tica();
cerrojo.liberar();
secci
on no cr
tica();
}
c Gustavo Romero
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
while (cerrado);
cerrado = true;
};
habilitar interrupciones();
}
void liberar() {
deshabilitar interrupciones();
cerrado = false;
habilitar interrupciones();
}
private:
volatile bool cerrado;
c Gustavo Romero
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
void liberar()
{
deshabilitar interrupciones();
cerrado = false;
habilitar interrupciones();
}
};
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Instrucciones atomicas
Lectura/modificacion/escritura sobre una posicion de
memoria:
lock2 xchg %eax,( %edx): intercambia de forma at
omica el
valor del registro con la direcci
on de memoria.
lock xadd %eax,( %edx): intercambia y suma, %eax =
( %edx), ( %edx) = %eax + ( %edx).
lock cmpxchg %ecx, ( %edx): compara el acumulador con
( %edx). Si son iguales activa ZF = 1 y hace ( %edx) = %ecx.
En otro caso limpia ZF = 0 y lleva ( %edx) al acumulador.
Exclusi
on mutua (52/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Exclusi
on mutua (53/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Exclusi
on mutua (54/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Exclusi
on mutua (55/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
adquirir()
{
while (test and set(&ocupado));
}
liberar()
{
ocupado = false;
}
private:
volatile bool ocupado;
};
c Gustavo Romero
Es eficiente? no.
Que sucede cuando
muchas hebras intentan
adquirir el cerrojo? baja
la tasa de aprovechamiento
del procesador debido a la
espera ocupada.
Puede llamarse a
adquirir()
recursivamente?
Exclusi
on mutua (56/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
c Gustavo Romero
Exclusi
on mutua (57/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
c Gustavo Romero
Exclusi
on mutua (58/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
c Gustavo Romero
Exclusi
on mutua (59/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Efecto ping-pong
Exclusi
on mutua (60/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
Exclusi
on mutua (61/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cerrojos Gesti
on de interrupciones Instrucciones especiales
La instruccion de intercambio
Disponible en la practica totalidad de los procesadores.
Permite crear un protocolo de seccion crtica? si.
c Gustavo Romero
Exclusi
on mutua (62/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Nucleo
c Gustavo Romero
Exclusi
on mutua (63/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Exclusi
on mutua (64/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
c Gustavo Romero
void se~
nalar() // v()
{
valor = valor + 1;
if (valor <= 0)
{
desbloquear(bloq.sacar());
}
}
private:
int valor;
lista<hebra> bloq;
};
Exclusi
on mutua (65/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
c Gustavo Romero
Exclusi
on mutua (66/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Multiprocesador:
Emplear instrucciones at
omicas: TAS, CAS, LL/SC,...
c Gustavo Romero
Exclusi
on mutua (67/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
void se~
nalar() // v()
{
deshabilitar_interrupciones();
valor = valor + 1;
if (valor <= 0)
{
desbloquear(bloq.sacar());
}
habilitar_interrupciones();
}
private:
volatile int valor;
volatile lista<hebra> bloq;
};
Exclusi
on mutua (68/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
void se~
nalar() // v()
{
while(TAS(ocupado) == true);
valor = valor + 1;
if (valor <= 0)
{
desbloquear(bloq.sacar());
}
ocupado = false;
}
private:
volatile bool ocupado;
volatile int valor;
volatile lista<hebra> bloq;
};
c Gustavo Romero
Exclusi
on mutua (69/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Semaforo debil
class sem
aforo_d
ebil
{
public:
sem
aforo_d
ebil(int _valor = 0):
valor(_valor),
bloq(vac
a)
void esperar() // p()
{
valor = valor - 1;
if (valor < 0)
{
bloq.meter(esta);
bloquear(esta);
}
}
void se~
nalar() // v()
{
valor = valor + 1;
if (valor <= 0)
{
desbloquear(bloq.sacar());
}
}
private:
int valor;
lista<hebra> bloq;
};
c Gustavo Romero
Exclusi
on mutua (70/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Exclusi
on mutua (71/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
variable global
sem
aforo s = 1;
hebrai
while(true)
{
s.esperar();
secci
on cr
tica();
s.se~
nalar();
secci
on no cr
tica();
}
Exclusi
on mutua (72/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Exclusi
on mutua (73/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
s = 1;
n = 0;
elemento b
ufer[];
int entra = 0, sale = 0;
void* productor(void*)
{
while(true)
{
elemento e = producir();
//
//
//
//
exclusi
on mutua b
ufer
n
umero de elementos
b
ufer ilimitado
posiciones del b
ufer
void* consumidor(void*)
{
while(true)
{
n.esperar(); // el orden
s.esperar();
s.esperar(); // importa
b
ufer[entra++] = e;
elemento e = b
ufer[sale++];
s.se~
nalar();
s.se~
nalar();
n.se~
nalar();
consumir(e);
}
5
Exclusi
on mutua (74/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Exclusi
on mutua (75/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
void* consumidor(void*)
{
while(true)
{
elementos.esperar();
exclusi
on.esperar();
elemento e = b
ufer[sale];
sale = (sale + 1) % N;
b
ufer[entra] = e;
entra = (entra + 1) % N;
exclusi
on.se~
nalar();
huecos.se~
nalar()
exclusi
on.se~
nalar();
elementos.se~
nalar();
consumir(e);
}
}
}
}
c Gustavo Romero
Exclusi
on mutua (76/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Exclusi
on mutua (77/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Semaforo binario
class sem
aforo_binario
{
public:
sem
aforo_binario():
ocupado(false),
bloq(vac
a)
void esperar()
{
if (!ocupado)
ocupado = true;
else
{
cola.a~
nadir(esta);
bloquear(esta);
}
}
void se~
nalar()
{
if (cola.vac
a())
ocupado = false;
else
desbloquear(cola.primero());
}
private:
volatile bool ocupado;
volatile cola<hebra> bloq;
};
Esta soluci
on tiene efectos adversos muy serios sobre la arquitectura del sistema.
c Gustavo Romero
Exclusi
on mutua (78/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
void depurador(hebra h)
{
bloquear(h);
operaciones de depuraci
on sobre h;
desbloquear(h);
}
Conflicto entre depurador y depurado:
Doble bloquear() = uno es
olvidado.
desbloquear() en el depurador()
viola la exclusi
on mutua al permitir
el acceso a su secci
on crtica a la
hebra que ejecut
o esperar().
desbloquear() en se~
nalar()
viola el funcionamiento del
depurador.
Exclusi
on mutua (79/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Consecuencias:
la planificaci
on y los semaforos son operaciones fuertemente
acopladas.
Cualquier metodo de sincronizacion que utilice bloquear() y
desbloquear() debera tener en cuenta sus consecuencias
sobre los semaforos.
Exclusi
on mutua (80/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
esperar(), se~
nalar(), depuracion y planificacion deben
coexistir.
Sin embargo el sistema podra dejar de funcionar si no
emparejamos de forma correcta las llamadas a bloquear() y
desbloquear() solucion no valida.
Intento 2:
No transferir informaci
on a traves de desbloquear().
Transferir la informacion acerca de quien posee el semaforo
de forma explcita.
Utilizar bloquear() y desbloquear() tan solo como
optimizaci
on.
c Gustavo Romero
Exclusi
on mutua (81/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Semaforo binario
class sem
aforo_binario {
public:
sem
aforo_binario():
propietario(nadie),
bloq(vac
a)
}
void se~
nalar()
{
if (cola.vac
a())
propietario = nadie;
else
{
propietario = cola.primero();
desbloquear(propietario);
}
}
void esperar()
{
if (propietario == nadie)
propietario = esta;
else
{
cola.a~
nadir(esta);
do
private:
bloquear(esta);
volatile hebra propietario;
while (propietario != esta);
volatile cola<hebra> bloq;
}
};
c Gustavo Romero
Exclusi
on mutua (82/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Consecuencias:
El diseno y la implementacion de semaforos requiere
habilidad y vision de futuro.
Modificar las operaciones del nucleo es justo lo contrario.
c Gustavo Romero
Exclusi
on mutua (83/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
En resumen...
Los semaforos son una herramienta de coordinacion
primitiva:
para garantizar la exclusi
on mutua.
para sincronizar hebras.
Exclusi
on mutua (84/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Monitores
c Gustavo Romero
Exclusi
on mutua (85/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Definicion de monitor
Un modulo software (clase) que contiene:
Una interfaz con uno o mas procedimientos.
Una secuencia de inicializaci
on.
Variables de datos locales.
Caractersticas:
Las variables locales s
olo son accesibles mediante los
procedimientos del monitor.
Una hebra entra en el monitor mediante la invocaci
on de uno
de sus procedimientos.
Solo una hebra puede estar ejecutando alg
un procedimiento del
monitor los monitores proporcionan exclusi
on mutua de
forma automatica.
c Gustavo Romero
Exclusi
on mutua (86/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Exclusi
on mutua (87/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Utilizaci
on de un vector contiguo de N posiciones como b
ufer
circular.
Interfaz con operaciones: recuperar() y depositar()
c Gustavo Romero
Exclusi
on mutua (88/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
}
void recuperar(elemento e)
{
e = b
ufer[cabeza];
cabeza = (cabeza + 1) % N;
contador = contador - 1;
}
private:
elemento b
ufer[N];
int cabeza, cola, contador;
};
Exclusi
on mutua autom
atica entre hebras.
Operaciones serializadas pero aun podemos depositar() sobre un b
ufer
lleno o recuperar() desde un b
ufer vacio 2 restricciones m
as.
c Gustavo Romero
Exclusi
on mutua (89/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
void recuperar(elemento e)
{
while (contador == 0)
* bloquear(rec.meter(esta));
e = b
ufer[cabeza];
cabeza = (cabeza + 1) % N;
contador = contador - 1;
void depositar(elemento e)
{
while (contador == N)
* bloquear(dep.meter(esta));
b
ufer[cola] = e;
cola = (cola + 1) % N;
contador = contador + 1;
if (!rec.vac
a())
desbloquear(rec.sacar());
}
if (!dep.vac
a())
desbloquear(dep.sacar());
}
private:
elemento b
ufer[N];
int cabeza, cola, contador;
cola<hebra> dep, rec;
};
Exclusi
on mutua (90/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Variables condicion
c Gustavo Romero
Exclusi
on mutua (91/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
Exclusi
on mutua (92/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
void recuperar(elemento e)
{
while (contador == 0)
no vacio.esperar();
e = b
ufer[cabeza];
cabeza = (cabeza + 1) % N;
contador = contador - 1;
no lleno.se~
nalar();
}
private:
elemento b
ufer[N];
int cabeza, cola, contador;
variable_condici
on no lleno, no vacio;
};
No bloquea el monitor, s
olo hebras.
c Gustavo Romero
Exclusi
on mutua (93/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
productor
consumidor
La sincronizacion queda
confinada en el interior del
monitor.
depositar() y recuperar()
son metodos del monitor.
Si estos metodos se
implementan correctamente
cualquier hebra podra utilizarlos
para sincronizarse de forma
correcta.
c Gustavo Romero
productori
while (true)
{
producir(e);
depositar(e);
}
consumidori
while (true)
{
recuperar(e);
consumir(e);
}
Exclusi
on mutua (94/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Sem
aforos Monitores Variables condici
on
c Gustavo Romero
Exclusi
on mutua (95/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Problemas
c Gustavo Romero
Exclusi
on mutua (96/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
vida de un filosofo
repetir
{
pensar
estar hambriento
coger tenedores
comer
soltar tenedores
}
c Gustavo Romero
Exclusi
on mutua (97/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusi
on mutua (98/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Cuando un fil
osofo quiere comer debe obtener los dos tenedores de sus
vecinos. Por cada tenedor que no tenga debe enviar un mensaje para
solicitarlo.
Cuando un fil
osofo posee un tenedor y recibe una petici
on pueden pasar
dos cosas:
Notas:
Cada tenedor puede estar limpio o sucio. Inicialmente todos los tenedores
est
an sucios.
El sistema debe inicializarse de forma no perfectamente simetrica, ej:
todos los fil
osofos poseen el tenedor izquierdo.
c Gustavo Romero
Exclusi
on mutua (99/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
c Gustavo Romero
Exclusi
on mutua (100/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
La inanicion es imposible.
c Gustavo Romero
Exclusi
on mutua (101/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
void* escritor(void*)
{
while(true)
{
no escritor.esperar();
escribir();
no escritor.se~
nalar();
}
}
Exclusi
on mutua (102/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
void* escritor(void*)
{
while(true)
{
no escritor.esperar();
escribir();
no lectores.se~
nalar();
no escritor.se~
nalar();
}
leer();
no lectores.esperar();
--numero lectores;
if (numero lectores == 0)
no escritor.se~
nalar();
no lectores.se~
nalar();
}
}
c Gustavo Romero
Exclusi
on mutua (103/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
c Gustavo Romero
Exclusi
on mutua (104/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
c Gustavo Romero
void adquirir_escritor()
{
sem_wait(CGUARD);
aw = aw + 1;
if (rr == 0)
{
ww = ww + 1;
sem_post(W);
}
sem_post(CGUARD);
sem_wait(W);
sem_wait(WGUARD);
}
void liberar_escritor()
{
sem_post(WGUARD);
sem_wait(CGUARD);
ww = ww - 1;
aw = aw - 1;
if (aw == 0)
while (rr < ar)
{
rr = rr + 1;
sem_post(R);
}
sem_post(CGUARD);
}
};
Exclusi
on mutua (105/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Pthreads
c Gustavo Romero
Exclusi
on mutua (106/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
c Gustavo Romero
Exclusi
on mutua (107/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusi
on mutua (108/109)
Introducci
on Usuario Hardware N
ucleo Problemas Pthreads
Exclusi
on mutua (109/109)