2. 2
Índice:
1. Suspensión y Reanudación
2. Semáforos
3. Propiedades y Características de los
Semáforos
4. Problemas Clásicos de Concurrencia
2
Tema
7:
Concurrencia
y
Sincronización
3. 3
Índice:
1. Suspensión y Reanudación
2. Semáforos
3. Propiedades y Características de los
Semáforos
4. Problemas Clásicos de Concurrencia
3
Tema
7:
Concurrencia
y
Sincronización
4. 4
1. Suspensión y Reanudación
Tema
7:
Concurrencia
y
Sincronización
Primitivas más simples:
sleep ()
Bloquea al proceso que la invoca
wakeup (int pid)
Reanuda a proceso cuyo PID se indica
¿Y si dicho proceso no está sleeping?
• La llamada a wakeup() no tiene efecto
• Se recuerda la llamada para que el próximo sleep() que haga
el proceso no tenga efecto.
• Se trata como un error.
5. 5
1. Suspensión y Reanudación
Tema
7:
Concurrencia
y
Sincronización
Implementación: ¡trivial!
sleep ()
Nuevo estado proceso llamante: bloqueado
Insertar en lista de procesos bloqueados
Activar bit “sleeping” en PCB para indicar causa de
bloqueo
wakeup (int pid)
Nuevo estado proceso despertado: preparado
Quitar de lista de procesos bloqueados e insertar en
preparados
Desactivar bit “sleeping” en PCB
6. 6
1. Suspensión y Reanudación
Tema
7:
Concurrencia
y
Sincronización
Aplicando estas primitivas a resolver problemas en
la vida real: productor/consumidor.
while(true)
{
producir_elemento();
if (contador==N)
sleep();
almacenar_elemento();
contador++;
if (contador==1)
wakeup(consumidor);
}
productor
0
1
2
3
tabla
N-1
ins ext
contador=0
while(true)
{
if (contador==0)
sleep();
retirar_elemento();
contador--;
if (contador==(N-1))
wakeup(productor);
usar_elemento();
}
consumidor
contador=1
contador=2
contador=3
contador=N
7. 7
1. Suspensión y reanudación
Tema
7:
Concurrencia
y
Sincronización
Problemas:
Suspensión es incondicional
• ¡No hay atomicidad comprobación-acción!
Procesos deben conocerse entre sí
Un único estado de espera por proceso
• Procesos están “o despiertos o dormidos”
• Si proceso está dormido, no hay vinculación alguna con la
causa por la que está en dicho estado
8. 8
Índice:
1. Suspensión y Reanudación
2. Semáforos
3. Propiedades y Características de los
Semáforos
4. Problemas Clásicos de Concurrencia
8
Tema
7:
Concurrencia
y
Sincronización
11. 11
2.1 Concepto de semáforo
Tema
7:
Concurrencia
y
Sincronización
E. W. Dijkstra (1.965)
Semaforo = tipo abstracto de datos, que encapsula:
Un contador entero
Una lista de procesos bloqueados en el semáforo
Operaciones sobre semáforos:
down(s):
• si contador = 0, proceso se bloquea en semáforo
• decrementa contador
up(s):
• Incrementa contador
• Si había algún proceso bloqueado en semáforo, reanuda uno
¡Ambas operaciones son atómicas!
12. 12
2.1 Concepto de semáforo
Tema
7:
Concurrencia
y
Sincronización
Utilidad: proteger acceso a recursos compartidos
A cada recurso compartido, se asocia semáforo con valor
inicial 1.
Secciones críticas asociadas al recurso:
• Protocolo de entrada: down(s)
• Protocolo de salida: up(s)
Ventajas:
Robustez
• Comprobación/Acción son atómicas
Procesos que se coordinan no necesitan conocerse entre sí
• Sólo necesitan conocer semáforos que comparten
Flexibilidad
• Tanto semáforos como recursos compartidos
18. 18
2.4 Semáforos binarios
Tema
7:
Concurrencia
y
Sincronización
Caso particular: semáforos con sólo dos estados:
Abierto (true, 1, …)
Cerrado (false, 0, …)
Operaciones sobre semáforos binarios:
down(s):
• si estado=cerrado, proceso se bloquea en semáforo
• estado=cerrado
up(s):
• estado=abierto
• Si había algún proceso bloqueado en semáforo, reanuda uno
¿Son más potentes semáforos contadores que
semáforos binarios?
20. 20
Índice:
1. Suspensión y Reanudación
2. Semáforos
3. Propiedades y Características de los
Semáforos
4. Problemas Clásicos de Concurrencia
20
Tema
7:
Concurrencia
y
Sincronización
21. 21
3. Propiedades y Características de los Sem.
Tema
7:
Concurrencia
y
Sincronización
Reglas generales:
Si un semáforo controla sección crítica,
• Cerrar lo más tarde posible
• Abrir tan pronto como sea posible
Secciones críticas anidadas:
• Evitar en la medida de lo posible
• down(a) y despues down(b)→ admisible si proceso que hace
up(b) no hace down(a)
Selección proceso que se desbloquea up:
No especificado
Depende de implementación:
• FIFO, aleatorio, prioridad…
Los programas nunca deben depender de este detalle!
22. 22
3. Propiedades y Características de los Sem.
Tema
7:
Concurrencia
y
Sincronización
Granularidad: nº de recursos controlados por cada
semáforo
Granularidad fina: un recurso por semáforo
Granularidad gruesa: un semáforo para todos los recursos:
23. 23
3. Propiedades y Características de los Sem.
Tema
7:
Concurrencia
y
Sincronización
Granularidad fina:
Ventajas:
mayor grado de paralelismo
P1
P2
Inconvenientes:
mayor número de semáforos
¡Posibilidad de interbloqueo!
Granularidad gruesa:
(inversa)
24. 24
Índice:
1. Suspensión y Reanudación
2. Semáforos
3. Propiedades y Características de los
Semáforos
4. Problemas Clásicos de Concurrencia
24
Tema
7:
Concurrencia
y
Sincronización
25. 25
4. Problemas Clásicos de Concurrencia
Tema
7:
Concurrencia
y
Sincronización
Los Filósofos Comensales
void filosofo (int i)
{
while(true)
{
pensar();
coger_tenedor(derecho(i));
coger_tenedor(izquierdo(i));
comer();
soltar_tenedor(derecho(i));
soltar_tenedor(izquierdo(i));
}
}
26. 26
4. Problemas Clásicos de Concurrencia
Tema
7:
Concurrencia
y
Sincronización
void filosofo (int i)
{
while(true)
{
pensar();
down (s);
coger_tenedor(derecho(i));
coger_tenedor(izquierdo(i));
comer();
soltar_tenedor(derecho(i));
soltar_tenedor(izquierdo(i));
up (s)
}
}
¿Una posible solución?