Semáforos en Sistemas Operativos: Exclusión Mutua
Semáforos en Sistemas Operativos: Exclusión Mutua
Operativos
UNIDAD 3
EXCLUSIÓN MUTUA Y SINCRONIZACIÓN
CON SEMÁFOROS
Dos zonas de código (en procesos distintos) diremos que son la misma sección crítica
si acceden a los mismos recursos compartidos (a todos o a algunos)
Dos zonas de código (en procesos distintos) diremos que son la misma sección crítica
si acceden a los mismos recursos compartidos (a todos o a algunos)
Exclusión Mutua
Es el requisito que garantiza que dos procesos, que comparten secciones críticas, no
pueden ejecutar simultáneamente dentro de ellas.
Dos zonas de código (en procesos distintos) diremos que son la misma sección crítica
si acceden a los mismos recursos compartidos (a todos o a algunos)
Exclusión Mutua
Es el requisito que garantiza que dos procesos, que comparten secciones críticas, no
pueden ejecutar simultáneamente dentro de ellas.
P1 P2
S
OK
Ocupado!
P1 P2
Gracias!
OK
S
P1 P2 P3
wait(S)
S
P1 P2 P3
signal(S) S
P1 P2 P3
P3
Cola de procesos bloqueados en S
wait decrementa
y si <0 Bloquea
sino, Pasa
signal incrementa
Si queda alguien lo Desbloquea
wait decrementa
y si <0 Bloquea
sino, Pasa
signal incrementa
Si queda alguien lo Desbloquea
¿Qué pasa en el sistema
cuando un proceso se bloquea?
wait
si es 1 lo pone a 0 y Pasa
sino lo deja en 0 y Bloquea al proceso
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y Pasa)
P3 P2 P0 P7 P3 P2 P0 P7
Cola de procesos bloqueados en S Cola de procesos bloqueados en S
En cada proceso:
/* program productor-consumidor*/ //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
int n; //Número de elementos producidos
void productor(int n){ void consumidor(int n){
while (true){ while (true){
producir(); extraer();
añadir(); n--;
n++; consumir();
} }
} }
n es compartida !!!
pero tengo que
proteger también las
acciones de añadir y
de extraer
es decir,
Los accesos al buffer
void main(){
n=0;
paralelos(productor(1),productor(2), consumidor(1));
}
El problema del Productor-Consumidor
Hay uno o más procesos generando algún tipo de datos (registros, caracteres, objetos,
etc.) y colocándolos en un buffer. Hay un único consumidor que está extrayendo datos
del buffer. El sistema debe garantizar que se impida la superposición de operaciones
sobre los datos.
Es decir, sólo un agente (productor o consumidor), puede acceder al mismo tiempo.
… no nos dicen nada acerca del tamaño del buffer… pensemos que es infinito
/* program productor-consumidor*/ //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
int n; //Número de elementos producidos
BinSemaphore s=1; void productor(int n){ void consumidor(int n){
while (true){ while (true){
producir(); wait(s);
extraer();
añadir();
wait(s); n--;extraer();
n++;añadir(); n--;
consumir();
} n++; } signal(s);
} signal(s); } consumir();
} }
} }
void main(){
n=0; wait
paralelos(productor(1),productor(2), consumidor(1)); si es 1 lo pone a 0 y Pasa
} si es 0 lo deja en 0 y Bloquea al proceso
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y continúa)
El problema del Productor-Consumidor
Hay uno o más procesos generando algún tipo de datos (registros, caracteres, objetos,
etc.) y colocándolos en un buffer. Hay un único consumidor que está extrayendo datos
del buffer. El sistema debe garantizar que se impida la superposición de operaciones
sobre los datos.
Es decir, sólo un agente (productor o consumidor), puede acceder al mismo tiempo.
… no nos dicen nada acerca del tamaño del buffer… pensemos que es infinito
¿Y si el consumidor llega primero? ¿Y si el consumidor va más rápido?
/* program productor-consumidor*/ //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
int n; //Número de elementos producidos
BinSemaphore s=1; void productor(int n){ void consumidor(int n){
while (true){ while (true){
producir(); wait(s);
extraer();
añadir();
wait(s); n--;extraer();
n++;añadir(); n--;
consumir();
} n++; } signal(s);
} signal(s); } consumir();
} }
} }
void main(){
n=0; wait
paralelos(productor(1),productor(2), consumidor(1)); si es 1 lo pone a 0 y Pasa
} si es 0 lo deja en 0 y Bloquea al proceso
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y continúa)
¿Semáforos? … Un juego de Rol
Podemos pensar que :
los semáforos juegan dos roles distintos
/* program productor-consumidor*/ //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
int n; //Número de elementos producidos
BinSemaphore s=1; //MUTEX void productor(int n){ void consumidor(int n){
BinSemaphore retardo=0; //SINCRO while (true){ wait(retardo);
while (true){
producir(); while (true){
wait(s);
wait(s); wait(s);
extraer();
añadir(); extraer();
n--;
n++; n--;
signal(s);
if (n==1)
signal(s); signal(s);
consumir();
} signal(retardo) } consumir();
} signal(s); } }
} }
}
void main(){
n=0; wait
paralelos(productor(1),productor(2), consumidor(1)); si es 1 lo pone a 0 y Pasa
} si es 0 lo deja en 0 y Bloquea al proceso
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y continúa)
El problema del Productor-Consumidor
Hay uno o más procesos generando algún tipo de datos (registros, caracteres, objetos,
etc.) y colocándolos en un buffer. Hay un único consumidor que está extrayendo datos
del buffer. El sistema debe garantizar que se impida la superposición de operaciones
sobre los datos.
Es decir, sólo un agente (productor o consumidor), puede acceder al mismo tiempo.
… no nos dicen nada acerca del tamaño del buffer… pensemos que es infinito
/* program productor-consumidor*/ //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
int n; //Número de elementos producidos
BinSemaphore s=1; //MUTEX void productor(int n){ void consumidor(int n){
BinSemaphore retardo=0; //SINCRO while (true){ wait(retardo);
producir(); while (true){
wait(s); wait(s);
añadir(); extraer();
n++; n--;
if (n==1) signal(s);
signal(retardo) consumir();
signal(s); } if (n==0)
} } wait(retraso);
} }
}
void main(){
n=0; wait
paralelos(productor(1),productor(2), consumidor(1)); si es 1 lo pone a 0 y Pasa
} si es 0 lo deja en 0 y Bloquea al proceso
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y continúa)
El problema del Productor-Consumidor
Hay uno o más procesos generando algún tipo de datos (registros, caracteres, objetos,
etc.) y colocándolos en un buffer. Hay un único consumidor que está extrayendo datos
del buffer. El sistema debe garantizar que se impida la superposición de operaciones
sobre los datos.
Es decir, sólo un agente (productor o consumidor), puede acceder al mismo tiempo.
… no nos dicen nada acerca del tamaño del buffer… pensemos que es infinito
/* program productor-consumidor*/ //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
int n; //Número de elementos producidos
BinSemaphore s=1; //MUTEX void productor(int n){ void consumidor(int n){
BinSemaphore retardo=0; //SINCRO while (true){ wait(retardo);
producir(); while (true){
wait(s); wait(s);
añadir(); extraer();
n++; n--;
if (n==1) signal(s);
signal(retardo) consumir();
signal(s); if (n==0)
} wait(retraso);
} }
}
void main(){
n=0; wait
paralelos(productor(1),productor(2), consumidor(1)); si es 1 lo pone a 0 y Pasa
} si es 0 lo deja en 0 y Bloquea al proceso
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y continúa)
El problema del Productor-Consumidor
Hay uno o más procesos generando algún tipo de datos (registros, caracteres, objetos,
etc.) y colocándolos en un buffer. Hay un único consumidor que está extrayendo datos
del buffer. El sistema debe garantizar que se impida la superposición de operaciones
sobre los datos.
Es decir, sólo un agente (productor o consumidor), puede acceder al mismo tiempo.
Instrucción Productor Consumidor s n retraso
1 1 0 0 /* program productor-consumidor*/
2 wait(s) 0 0 0 int n; //Número de elementos producidos
3 añadir() 0 0 0
BinSemaphore s=1; //MUTEX
4 n++ 0 1 0
if (n==1) BinSemaphore retardo=0; //SINCRO
5 0 1 1
signal(retraso)
6 signal(s) 1 1 1
7 producir() 1 1 1
8 wait(retraso) 1 1 0 //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
9 wait(s) 0 1 0
10 extraer(); 0 1 0
11 n--; 0 0 0
void productor(int n){ void consumidor(int n){
12 signal(s) 1 0 0 while (true){ wait(retardo);
13 consumir(); 1 0 0 producir(); while (true){
14 wait(s) 0 0 0 wait(s); wait(s);
15 añadir() 0 0 0
16 n++ 0 1 0
añadir(); extraer();
if (n==1) n++; n--;
17 0 1 1
signal(retraso) if (n==1) signal(s);
18 signal(s) 1 1 1 signal(retardo) consumir();
if (n==0)
19 1 1 1 signal(s); if (n==0)
wait(retraso)
20 wait(s) 0 1 1 } wait(retraso);
21 extraer(); 0 1 1 } }
22 n--; 0 0 1 }
23 signal(s) 1 0 1
24 consumir(); 1 0 1
if (n==0)
25 1 0 0
wait(retraso) void main(){ wait
26 wait(s) 0 0 0 n=0; si es 1 lo pone a 0 y Pasa
27 extraer(); 0 0 0
paralelos(productor(1),productor(2), consumidor(1)); si es 0 lo deja en 0 y Bloquea al proceso
28 n--; 0 -1 0
29 signal(s) 1 -1 0
}
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y continúa)
El problema del Productor-Consumidor
Hay uno o más procesos generando algún tipo de datos (registros, caracteres, objetos,
etc.) y colocándolos en un buffer. Hay un único consumidor que está extrayendo datos
del buffer. El sistema debe garantizar que se impida la superposición de operaciones
sobre los datos.
Es decir, sólo un agente (productor o consumidor), puede acceder al mismo tiempo.
Instrucción Productor Consumidor s n retraso
1 1 0 0 /* program productor-consumidor*/ ¡¡¡¡ Las consultas a elementos
2 wait(s) 0 0 0 int n; //Número de elementos producidos
3 añadir() 0 0 0
BinSemaphore s=1; //MUTEX compartidos deben estar
4 n++ 0 1 0
5
if (n==1)
0 1 1
BinSemaphore retardo=0; //SINCRO también protegidas por un
6
signal(retraso)
signal(s) 1 1 1
MUTEX !!!!
7 producir() 1 1 1
8 wait(retraso) 1 1 0 //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
9 wait(s) 0 1 0
10 extraer(); 0 1 0
11 n--; 0 0 0
void productor(int n){ void consumidor(int n){
12 signal(s) 1 0 0 while (true){ wait(retardo);
13 consumir(); 1 0 0 producir(); while (true){
14 wait(s) 0 0 0 wait(s); wait(s);
15 añadir() 0 0 0
añadir(); extraer();
16 n++ 0 1 0
if (n==1) n++; n--;
17 0 1 1
signal(retraso) if (n==1) signal(s);
18 signal(s) 1 1 1 signal(retardo) consumir();
consumir();
if (n==0)
19 1 1 1 signal(s); if (n==0)
wait(retraso)
20 wait(s) 0 1 1 } wait(retraso);
21 extraer(); 0 1 1 } Mientras consumíamos se nos ha }
22 n--; 0 0 1 colado un productor que nos ha }
23 signal(s) 1 0 1 cambiado la n
24 consumir(); 1 0 1 y la consultamos después para
if (n==0)
25 1 0 0 ver si sincronizamos…
wait(retraso) void main(){ wait
26 wait(s) 0 0 0 n=0; si es 1 lo pone a 0 y Pasa
27 extraer(); 0 0 0
paralelos(productor(1),productor(2), consumidor(1)); si es 0 lo deja en 0 y Bloquea al proceso
28 n--; 0 -1 0
29 signal(s) 1 -1 0
}
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y continúa)
El problema del Productor-Consumidor
Hay uno o más procesos generando algún tipo de datos (registros, caracteres, objetos,
etc.) y colocándolos en un buffer. Hay un único consumidor que está extrayendo datos
del buffer. El sistema debe garantizar que se impida la superposición de operaciones
sobre los datos.
Es decir, sólo un agente (productor o consumidor), puede acceder al mismo tiempo.
Instrucción Productor Consumidor s n retraso
1 1 0 0 /* program productor-consumidor*/
2 wait(s) 0 0 0 int n; //Número de elementos producidos
3
4
añadir()
n++
0
0
0
1
0
0
BinSemaphore s=1; //MUTEX
BinSemaphore retardo=0; //SINCRO
¿cómo lo arreglamos?
if (n==1)
5 0 1 1
signal(retraso)
6 signal(s) 1 1 1
7 producir() 1 1 1
8 wait(retraso) 1 1 0 //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
9 wait(s) 0 1 0
10 extraer(); 0 1 0
11 n--; 0 0 0
void productor(int n){ void consumidor(int n){
12 signal(s) 1 0 0 while (true){ wait(retardo);
13 consumir(); 1 0 0 producir(); while (true){
14 wait(s) 0 0 0 wait(s); wait(s);
15 añadir() 0 0 0
16 n++ 0 1 0
añadir(); extraer();
if (n==1) n++; n--;
17 0 1 1
signal(retraso) if (n==1) signal(s);
18 signal(s) 1 1 1 signal(retardo) consumir();
if (n==0)
19 1 1 1 signal(s); if (n==0)
wait(retraso)
20 wait(s) 0 1 1 } wait(retraso);
21 extraer(); 0 1 1 } }
22 n--; 0 0 1 }
23 signal(s) 1 0 1
24 consumir(); 1 0 1
if (n==0)
25 1 0 0
wait(retraso) void main(){ wait
26 wait(s) 0 0 0 n=0; si es 1 lo pone a 0 y Pasa
27 extraer(); 0 0 0
paralelos(productor(1),productor(2), consumidor(1)); si es 0 lo deja en 0 y Bloquea al proceso
28 n--; 0 -1 0
29 signal(s) 1 -1 0
}
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y continúa)
El problema del Productor-Consumidor
Hay uno o más procesos generando algún tipo de datos (registros, caracteres, objetos,
etc.) y colocándolos en un buffer. Hay un único consumidor que está extrayendo datos
del buffer. El sistema debe garantizar que se impida la superposición de operaciones
sobre los datos.
Es decir, sólo un agente (productor o consumidor), puede acceder al mismo tiempo.
Instrucción Productor Consumidor s n retraso
1 1 0 0 /* program productor-consumidor*/
2 wait(s) 0 0 0 int n; //Número de elementos producidos
3 añadir() 0 0 0
BinSemaphore s=1; //MUTEX
4 n++ 0 1 0
if (n==1) BinSemaphore retardo=0; //SINCRO
5 0 1 1
signal(retraso)
6 signal(s) 1 1 1
7 producir() 1 1 1
8 wait(retraso) 1 1 0 //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
9 wait(s) 0 1 0
10 extraer(); 0 1 0
11 n--; 0 0 0
void productor(int n){ void consumidor(int n){
12 signal(s) 1 0 0 while (true){ wait(retardo);
13 consumir(); 1 0 0 producir(); while (true){
14 wait(s) 0 0 0 wait(s); wait(s);
15 añadir() 0 0 0
16 n++ 0 1 0
añadir(); extraer();
if (n==1) n++; n--;
17 0 1 1
signal(retraso) if (n==1) signal(s);
18 signal(s) 1 1 1 signal(retardo) consumir();
if (n==0)
19 1 1 1 signal(s); wait(s)
wait(retraso)
20 wait(s) 0 1 1 } if (n==0)
21 extraer(); 0 1 1 } signal(s)
22 n--; 0 0 1 wait(retraso);
23 signal(s) 1 0 1 }
24 consumir(); 1 0 1
if (n==0)
}
25 1 0 0
wait(retraso) void main(){
26 wait(s) 0 0 0 n=0; wait
27 extraer(); 0 0 0 si es 1 lo pone a 0 y Pasa
paralelos(productor(1),productor(2), consumidor(1));
28 n--; 0 -1 0 si es 0 lo deja en 0 y Bloquea al proceso
29 signal(s) 1 -1 0
}
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y continúa)
El problema del Productor-Consumidor
Hay uno o más procesos generando algún tipo de datos (registros, caracteres, objetos,
etc.) y colocándolos en un buffer. Hay un único consumidor que está extrayendo datos
del buffer. El sistema debe garantizar que se impida la superposición de operaciones
sobre los datos.
Es decir, sólo un agente (productor o consumidor), puede acceder al mismo tiempo.
Instrucción Productor Consumidor s n retraso
1 1 0 0 /* program productor-consumidor*/
2 wait(s) 0 0 0 int n; //Número de elementos producidos
3 añadir() 0 0 0
BinSemaphore s=1; //MUTEX
4 n++ 0 1 0
if (n==1) BinSemaphore retardo=0; //SINCRO
5 0 1 1
signal(retraso)
6 signal(s) 1 1 1
7 producir() 1 1 1
8 wait(retraso) 1 1 0 //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
9 wait(s) 0 1 0
10 extraer(); 0 1 0
11 n--; 0 0 0
void productor(int n){ void consumidor(int n){
12 signal(s) 1 0 0 while (true){ wait(retardo);
13 consumir(); 1 0 0 producir(); while (true){
14 wait(s) 0 0 0 wait(s); wait(s);
15 añadir() 0 0 0
16 n++ 0 1 0
añadir(); extraer();
if (n==1) n++; n--;
17 0 1 1
signal(retraso) if (n==1) signal(s);
18 signal(s) 1 1 1 signal(retardo) consumir();
if (n==0)
19 1 1 1 signal(s); wait(s)
wait(retraso)
20 wait(s) 0 1 1 } if (n==0)
21 extraer(); 0 1 1 } wait(retraso);
22 n--; 0 0 1 signal(s)
23 signal(s) 1 0 1 }
24 consumir(); 1 0 1
if (n==0)
}
25 1 0 0
wait(retraso) void main(){
26 wait(s) 0 0 0 n=0; wait
27 extraer(); 0 0 0 si es 1 lo pone a 0 y Pasa
paralelos(productor(1),productor(2), consumidor(1));
28 n--; 0 -1 0 si es 0 lo deja en 0 y Bloquea al proceso
29 signal(s) 1 -1 0
}
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y continúa)
El problema del Productor-Consumidor
Hay uno o más procesos generando algún tipo de datos (registros, caracteres, objetos,
etc.) y colocándolos en un buffer. Hay un único consumidor que está extrayendo datos
del buffer. El sistema debe garantizar que se impida la superposición de operaciones
sobre los datos.
Es decir, sólo un agente (productor o consumidor), puede acceder al mismo tiempo.
Instrucción Productor Consumidor s n retraso
1 1 0 0 /* program productor-consumidor*/
2 wait(s) 0 0 0 int n; //Número de elementos producidos
3 añadir() 0 0 0
BinSemaphore s=1; //MUTEX
4 n++ 0 1 0
if (n==1) BinSemaphore retardo=0; //SINCRO
5 0 1 1
signal(retraso)
6 signal(s) 1 1 1
7 producir() 1 1 1
8 wait(retraso) 1 1 0 //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
9 wait(s) 0 1 0
10
11
extraer();
n--;
0
0
1
0
0
0
¿¿¡¡ UN WAIT DENTRO
void productor(int n){ DE UNA
void consumidor(int n){
12
13
signal(s)
consumir();
1
1
0
0
0
0
while (true){
producir();
SECCIÓN CRITICA!!??
wait(retardo);
while (true){
14
15
wait(s)
añadir()
0
0
0
0
0
0
wait(s); Peor aún INTERBLOQUEO
añadir();
wait(s);
extraer();
16 n++ 0 1 0
if (n==1) n++; n--;
17 0 1 1
signal(retraso) if (n==1) signal(s);
18 signal(s) 1 1 1 signal(retardo) consumir();
if (n==0)
19 1 1 1 signal(s); wait(s)
wait(retraso)
20 wait(s) 0 1 1 } if (n==0)
21 extraer(); 0 1 1 } wait(retraso);
22 n--; 0 0 1 signal(s)
23 signal(s) 1 0 1 }
24 consumir(); 1 0 1
if (n==0)
}
25 1 0 0
wait(retraso) void main(){
26 wait(s) 0 0 0 n=0; wait
27 extraer(); 0 0 0 si es 1 lo pone a 0 y Pasa
paralelos(productor(1),productor(2), consumidor(1));
28 n--; 0 -1 0 si es 0 lo deja en 0 y Bloquea al proceso
29 signal(s) 1 -1 0
}
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y continúa)
El problema del Productor-Consumidor
Hay uno o más procesos generando algún tipo de datos (registros, caracteres, objetos,
etc.) y colocándolos en un buffer. Hay un único consumidor que está extrayendo datos
del buffer. El sistema debe garantizar que se impida la superposición de operaciones
sobre los datos.
Es decir, sólo un agente (productor o consumidor), puede acceder al mismo tiempo.
Instrucción Productor Consumidor s n retraso
1 1 0 0 /* program productor-consumidor*/
2 wait(s) 0 0 0 int n; //Número de elementos producidos ¡¡¡ Utilizando variables locales que nadie
3 añadir() 0 0 0
BinSemaphore s=1; //MUTEX más podrá cambiar y que me recuerdan el
4 n++ 0 1 0
if (n==1) BinSemaphore retardo=0; //SINCRO valor de la compartida para cuando
5
signal(retraso)
0 1 1 necesite consultarlo !!!!
6 signal(s) 1 1 1
7 producir() 1 1 1
8 wait(retraso) 1 1 0 //Morris Lester Szyslak (Moe) //Homer Jay Simpson (Homer)
9 wait(s) 0 1 0
10 extraer(); 0 1 0
11 n--; 0 0 0
void productor(int n){ void consumidor(int n){
12 signal(s) 1 0 0 while (true){ int m; //local mía, privada
wait(retardo);
13 consumir(); 1 0 0 producir(); while
wait(retardo);
(true){
14 wait(s) 0 0 0 wait(s); while
wait(s);
(true){
15 añadir() 0 0 0
16 n++ 0 1 0
añadir(); wait(s);
extraer();
if (n==1) n++; n--;
extraer();
17 0 1 1
signal(retraso) if (n==1) signal(s);
n--;
18 signal(s) 1 1 1 signal(retardo) m=n; // me guardo el valor
consumir();
if (n==0)
19 1 1 1 signal(s); if
signal(s);
(n==0)
wait(retraso)
20 wait(s) 0 1 1 } consumir();
wait(retraso);
21 extraer(); 0 1 1 } } if (m==0) //consulto mi valor
22 n--; 0 0 1 } wait(retraso);
23 signal(s) 1 0 1 }
24 consumir(); 1 0 1
if (n==0)
}
25 1 0 0
wait(retraso) void main(){
26 wait(s) 0 0 0 n=0; wait
27 extraer(); 0 0 0 si es 1 lo pone a 0 y Pasa
paralelos(productor(1),productor(2), consumidor(1));
28 n--; 0 -1 0 si es 0 lo deja en 0 y Bloquea al proceso
29 signal(s) 1 -1 0
}
signal
Si la cola está vacía lo pone a 1
sino Desbloquea a uno de la cola
(y continúa)
¿Conclusión?
• Trabajar con semáforos es altamente complejo en determinados problemas, hay que
analizar bien las posibilidades …. ¿Tengo que probar todas las posibles trazas?
¿Cuál elegir?
/* program productor-consumidor*/
Semaphore sProd=0; //SINCRO (su contador cuenta los que hay producidos)
BinSemaphore s=1; //MUTEX de acceso al buffer
/* program productor-consumidor*/
Semaphore sHuecos=24 //SINCRO (su contador cuenta los huecos que quedan en la caja)
Semaphore sProd=0; //SINCRO (su contador cuenta los que hay producidos)
BinSemaphore s=1; //MUTEX de acceso al buffer
PROCESO 1 PROCESO 2
{ {
<codigo proceso 1> wait(p1);
signal(p1); <codigo proceso2>
} }
El semáforo se inicializará a 0
Exclusión Mutua: Barreras con semáforos
Barreras
◦ Una barrera es el punto en el código tal que ningún proceso lo traspasa hasta que todos los procesos
han llegado a su ejecución.
◦ Si y solo si todos los procesos llegan a la barrera, continúan ejecutándose.
Exclusión Mutua: Barreras con semáforos
Barreras
◦ Una barrera es el punto en el código tal que ningún proceso lo traspasa hasta que todos los
procesos han llegado a su ejecución.
◦ Si y solo si todos los procesos llegan a la barrera, continúan ejecutándose.
◦ Supongamos 2 procesos: Ambos deben poder detenerse y notificar al otro que han llegado
a la barrera
PROCESO 1 PROCESO 2
…. ….
<codigo proceso 1> <codigo proceso 2>
signal(barrera1); signal(barrera2);
wait(barrera2); wait(barrera1);
<codigo tras la barrera> <codigo tras la barrera>
…. ….
Ambos semáforos se inicializarán a 0
Cada proceso primero notifica que ha llegado a su barrera y
luego espera en la del otro.
Exclusión Mutua: Barreras con Semáforos
Ejercicio:
Implementar una barrera para un numero arbitrario (n) de procesos.
Explicar detalladamente la solución alcanzada.
Solución
◦ Basada en un proceso coordinador que se encarga de retener a todos los procesos
en su barrera hasta que llega el último. Se precisan tantos semáforos como procesos
(incluyendo al proceso coordinador). El coordinador conoce el numero de procesos.
Lectores – escritores
◦ Existe un recurso común (fichero, base de datos, zona de
memoria, banco de registros del procesador, etc…) al cual acceden
varios procesos para leer y varios procesos para escribir de
manera concurrente. (lectores y escritores respectivamente)
◦ Los lectores pueden acceder concurrentemente entre si, ya que en
ningún caso pueden ocasionar problemas de inconsistencia en los
datos.
◦ Los escritores solo pueden acceder en exclusión mutua con otros
escritores y con los lectores.
◦ Es decir:
1. Cualquier número de lectores puede leer el recurso simultáneamente
2. Sólo puede escribir en el recurso un escritor en cada instante
3. Si un escritor está accediendo al recurso, ningún lector puede leerlo.
Exclusión Mutua: SEMAFOROS
El barbero dormilón.
En la peluquería hay 1 silla de barbero y n
sillas donde los clientes esperan su turno.
El barbero se echa a dormir si no hay clientes
esperando.
Cuando llega un cliente despierta al peluquero,
si llegan más clientes mientras el peluquero
está cortando el pelo, estos se esperan en las
sillas de espera, si hay sitio, sino, salen del
establecimiento.
Exclusión Mutua: SEMAFOROS
El barbero dormilón.
# define sillas 5 //Número de sillas de espera para clientes
semaphore clientes = 0; //Número de clientes esperando ser atendidos
semaphore barberos = 0; //Número de peluqueros que están ociosos
semaphore mutex = 1; //Para garantizar la exclusión mutua
int clientes_esperando = 0; //Contador de número de clientes esperando
semaphore begincorte=endcorte=0;
Los coches podrán pasar mientras no llegue ningún peatón, cuando llegue
uno, se pararán y esperarán a que el peatón abandone la zona de cruce.
• MONITORES