Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sistemas Operativos
Sistemas Operativos
Tema 7: Concurrencia y
Sincronización
1
Índice:
Tema 7: Concurrencia y Sincronización
1. Suspensión y Reanudación
2. Semáforos
1. Suspensión y Reanudación
2. Semáforos
sleep ()
Bloquea al proceso que la invoca
4
1. Suspensión y Reanudación
Implementación: ¡trivial!
Tema 7: Concurrencia y Sincronización
sleep ()
Nuevo estado proceso llamante: bloqueado
Insertar en lista de procesos bloqueados
Activar bit “sleeping” en PCB para indicar causa de
bloqueo
5
1. Suspensión y Reanudación
Aplicando estas primitivas a resolver problemas en
Tema 7: Concurrencia y Sincronización
6
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
7
Índice:
Tema 7: Concurrencia y Sincronización
1. Suspensión y Reanudación
2. Semáforos
1. Concepto de semáforo
2. Implementación de semáforos
3. Semáforos en la práctica
4. Semáforos binarios
9
2. Semáforos
Tema 7: Concurrencia y Sincronización
1. Concepto de semáforo
2. Implementación de semáforos
3. Semáforos en la práctica
4. Semáforos binarios
10
2.1 Concepto de semáforo
E. W. Dijkstra (1.965)
Tema 7: Concurrencia y Sincronización
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
12
• Tanto semáforos como recursos compartidos
2. Semáforos
Tema 7: Concurrencia y Sincronización
1. Concepto de semáforo
2. Implementación de semáforos
3. Semáforos en la práctica
4. Semáforos binarios
13
2.2 Implementación de semáforos
Tema 7: Concurrencia y Sincronización
void down(semaforo s)
{
if (s->contador>0)
s->contador--; void up(semaforo s)
{
else
if (lista_vacia(s->bloqueados))
{
s->contador++;
insertar_en_lista (&s->bloqueados, getpid());
else
sleep();
{
}
int pid=sacar_de_lista(s->bloqueados);
}
semaforo CrearSemaforo(int valor); wakeup(pid);
}
void DestruirSemaforo(semaforo s);
} 14
2. Semáforos
Tema 7: Concurrencia y Sincronización
1. Concepto de semáforo
2. Implementación de semáforos
3. Semáforos en la práctica
4. Semáforos binarios
15
2.3 Semáforos en la práctica
Productor/Consumidor con semáforos
Tema 7: Concurrencia y Sincronización
productor consumidor
while(true) tabla
while(true)
{ {
0
producir_elemento(); down(llenas);
1
ins ext down(excmut);
down(vacias);
down(excmut); 2
down(excmut);
down(vacias); retirar_elemento();
contador=0 3
almacenar_elemento(); up(excmut);
excmut=1 up(vacias);
up(excmut); N-1
up(llenas); consumir_elemento();
} vacias=N }
llenas=0
16
2. Semáforos
Tema 7: Concurrencia y Sincronización
1. Concepto de semáforo
2. Implementación de semáforos
3. Semáforos en la práctica
4. Semáforos binarios
17
2.4 Semáforos binarios
Caso particular: semáforos con sólo dos estados:
Tema 7: Concurrencia y Sincronización
Abierto (true, 1, …)
Cerrado (false, 0, …)
struct s_semaforo
{
void down(semaforo s)
int contador;
{
semaforo_b blqd; /* =abierto */
down_b(s->blqd);
semaforo_b exc; /* =abierto */
semaforo_b esp; /* =cerrado*/ down_b(s->exc);
} --(s->contador);
if (s->contador >=0)
typedef s_semaforo *semaforo;
up_b(s->exc);
else
void up(semaforo s)
{
{
up_b(s->exc);
down_b(s->exc);
down_b(s->esp);
++(s->contador); }
if (s->contador <=0)
up_b(s->blqd);
up_b(s->esp);
}
up_b(s->exc);
}
19
Índice:
Tema 7: Concurrencia y Sincronización
1. Suspensión y Reanudación
2. Semáforos
semáforo
Granularidad fina: un recurso por semáforo
Granularidad gruesa: un semáforo para todos los
recursos:
22
3. Propiedades y Características de los Sem.
Granularidad fina: Granularidad gruesa:
Tema 7: Concurrencia y Sincronización
Ventajas: (inversa)
mayor grado de
paralelismo
Inconvenientes:
mayor número de semáforos
¡Posibilidad de interbloqueo!
P1
P2
23
Índice:
Tema 7: Concurrencia y Sincronización
1. Suspensión y Reanudación
2. Semáforos
soltar_tenedor(derecho(i));
soltar_tenedor(izquierdo(i));
}
}
25
4. Problemas Clásicos de Concurrencia
¿Una posible solución?
Tema 7: Concurrencia y Sincronización
26
4. Problemas Clásicos de Concurrencia
f[0] void coger_tenedores(int i)
Tema 7: Concurrencia y Sincronización
{
down(excmut);
f[N] estado[i]= HAMBRIENTO;
probar(i);
void soltar_tenedores(int i)
up(excmut);
{
down(f[i]);
down(excmut);
excmut }
estado[i]= PENSANDO;
f[1] probar(izquierdo(i));
f[3] probar(derecho(i));
up(excmut);
void filosofo (int i) }
{
void
f[2]probar (int i)
while(true)
{
{
if ((estado[i]==HAMBRIENTO) && (estado[izquierdo(i) != COMIENDO)
pensar();
&& (estado[derecho(i)] != COMIENDO)
coger_tenedores(i);
{
comer();
estado[i]= COMIENDO;
soltar_tenedores(i);
up(f[i])
}
}
} 27
}