Universidad Tecnológica Nacional Facultad Regional Buenos Aires. Sistemas Operativos Guía Práctica nº 2 Sincronización Realizada por los Profesores: Lic. Graciela E. De Luca Ing. Nicanor Casas Con la colaboración del Ing. Néstor Esquivel
Microsoft Word - Guia Sincronización 2007.docSistemas
Operativos
Sincronización
Realizada por los Profesores: Lic. Graciela E. De Luca Ing. Nicanor
Casas Con la colaboración del Ing. Néstor Esquivel
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-2-
Definición: Dos sentencias cualesquiera Si y Sj pueden ejecutarse
concurrentemente produciendo el mismo resultado que si se
ejecutaran secuencialmente sí solo si se cumplen las siguientes
condiciones: (Reglas de Berstein) 1. R(Si) ∩ W(Sj) = (∅) 2. W(Si) ∩
R(Sj) = (∅) 3. W(Sj) ∩ W(Sj) = (∅)
Según las condiciones de Berstein: R(A) = {b,d,c,f,g,} R(B) =
{x,k,m,c} W(A) = {c,h} W(B) = {m} Entonces: R(A) ∩ W(B) =Ø R(B) ∩
W(A) = {c} W(A) ∩ W(B) =Ø Este grupo de sentencias no se pueden
ejecutar en paralelo Ejercitación 1. De un ejemplo donde el
algoritmo que utiliza TSL produce inanición (Starvation) Supongamos
que tenemos tres procesos A, B y C y la variable ocupado = 0.
READY BLOCK En este instante A que está en ejecución hace TSL
(ocupado) dejando ocupado = 1
READY BLOCK Luego pasa B a ejecución y hace TSL (ocupado) quedando
en espera activa. Luego C pasa de bloqueados a Listos, ubicándose
detrás de A en la cola.
B
C
A
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-3-
Cuando se le acaba el quantum de tiempo a B pasa a Listos y A a
ejecución.
READY BLOCK A coloca ocupado = 0 Cuando C pasa a ejecución hace
TSL(ocupado) como ocupado estaba en 0 lo coloca en 1 y pasa a
utilizar la región critica, ingresando a esta antes que B y si esta
situación se repite B puede padecer inanición. 2. Dados los
procesos A y B con variables compartidas, se pide verificar si
pueden ejecutar en paralelo.
De no ser así en que orden podrían ejecutar. A B c=b+d h=c+f+g
print c
m=6*x+k print m/c
3. Dado el siguiente grafo de precedencia, colocar los semáforos
para asegurar la ejecución de los
procesos en ese orden.
Valores Iniciales de los semáforos a=1
b1=b2=b3=c1=c2=d1=d2=d3=d4=0
c=b+d
B, C
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-4-
V(b1) V(b2) V(b3)
4. Sincronizar A y B de tal manera que:
a) Siempre el resultado de la ejecución sea 50 y 200 o 200 y 50. b)
Siempre el resultado de la ejecución sea 50 y 200
A B
X=500 X=X/10 Print(X)
a) Como no se necesita darle un orden a la ejecución sólo se debe
poner mutua exclusión, por lo tanto con un semáforo basta.
A B
P(mutex) X=500 X=X/10 Print(X) V(mutex)
b) Aquí se necesita darle un orden a la ejecución por lo tanto se
utilizará semáforos cruzados.
A B P(s) X=199 X=x+1 Print (X) V(k)
P(k) X=500 X=X/10 Print(X) V(s)
Para que B se ejecute primero el valor del semáforo k debe estar en
1 y s en 0 k=1 s=0
5. Colocar los semáforos de tal manera que los procesos A, B, C
ejecuten siempre en la secuencia
ABCABC…
P(k) ---- ---- ---- V(r)
P(r) ---- ---- ---- V(s)
Para que A ejecute primero s=1, k=0, r=0
6. Colocar los semáforos de tal manera que los procesos A, B, C
ejecuten siempre en la secuencia
BACABACA…
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-5-
P(c) ---- ---- V(b)
Para comenzar con B el valor inicial de b=k=1, c=s=0
A B C P(s) ---- ---- V(k)
P(b) P(k) ---- ---- V(c) V(s)
P(c) P(k) ---- ---- V(b) V(s)
Prueba de Escritorio Para comprobar si el orden de semáforos es
correcto, hacemos la prueba de escritorio con una secuencia
distinta a la indicada. Si funciona de todas formas, los semáforos
fueron correctamente ubicados. En este caso usaremos BABCA.
k b c s A B C Q
1 1 0 0 0
0 1
0
Y luego comienza nuevamente a ejecutar B.
7. Colocar los semáforos de tal manera que los procesos A, B, C
ejecuten siempre en la secuencia
A(BóC)A(BóC)…
Si queremos que BóC ejecuten solo uno a la vez podríamos
reemplazarlos por un proceso X
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-6-
P(s) ---- ---- V(k)
P(s) ---- ---- V(k)
Para comenzar con el proceso A inicializamos k=1 y s=0
k s A B C 1 0 0
1
P(s) ---- V(k)
8. Colocar los semáforos de tal manera que los procesos A, B, C
ejecuten siempre en la secuencia
A(ByC)A(ByC)…
P(a) ---- ---- V(k)
Valor inicial del semáforo k=2, s=0,a=0 9. El que sigue nos muestra
2 procesos concurrentes que comparten una variable global x.
(Las restantes variables son locales a los procesos)
A P(k) P(k) ---- ---- V(s) V(a)
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-7-
P1 P2 While (TRUE) { m = 2 * x – n; imprimir (m); }
while (TRUE) { leer_teclado (d); x := d – c * 5; }
a) Sincronizar los procesos para que P1 use todos los valores x
suministrados por P2.
Declaración, Inicialización de Variables y Semáforos var x:
entero
P1 P2 While (TRUE) { P(s) m = 2 * x – n; imprimir (m); V(k) }
while (TRUE) { P(k) leer_teclado (d); x := d – c * 5; V(s) }
s=1, k=0 b) Sincronizar los procesos para que P1 utilice un valor
Sí y otro No de la variable x, es decir,
utilice los valores primero, tercero, quinto, etc.
Declaración, Inicialización de Variables y Semáforos var x:
entero
P1 P2 While (TRUE) { P(s) m = 2 * x – n; imprimir (m); V(K) }
n=0 while (TRUE) { P(K) n++; leer_teclado (d); x := d – c * 5; if
(n mod(2)=0) v(k); else V(s); }
n es una variable local a P2
Otra solución:
Declaración, Inicialización de Variables y Semáforos var x:
entero
P1 P2 While (TRUE) { P(s) P(s) m = 2 * x – n; imprimir (m); V(K)
V(K)
while (TRUE) { P(K) leer_teclado (d); x := d – c * 5; V(s); }
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-8-
K=2, s=1 para que la primera vez ejecute.
10. Se tienen 2 procesos paralelos:
int x = 0;
{ while (TRUE)
print (x); }
a) Sincronizar usando semáforos para que se escriba la secuencia:
0, 1, 2, 3, 4, 5...
Valores iniciales: k=1, s=0
Proceso A Proceso B while (TRUE) { P(s) x = x + 1; V(k) }
while (TRUE) { P(k)
print (x); V(s)
}
b) Sincronizar usando semáforos para que se escriba la secuencia:
1, 4, 7, 10, 13… Valores iniciales: s=1, k=2
Proceso A Proceso B while (TRUE) { P(s) x = x + 1; V(k) }
while (TRUE) { P(k) P(k) P(k) print (x); V(s)
V(s) V(s)
3
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-9-
P(k) P(k) P(k) ---- V(s) V(s) V(s)
11. Dadas la siguiente secuencia lógica y los valores iniciales de
los semáforos, verificar si esta es la
secuencia normal de ejecución y si está bien realizada la
sincronización.
X Y Z P(S) P(C) V(R) V(S)
P(R) P(B) V(B) V(S)
P(R) V(C)
Con los valores iniciales de S=1, R=0, B=0, C=1 y cuya secuencia
normal de ejecución sería XYXZXYXZ
S R C B X Y Z Q 1 0 1 0 0 P(S) 0 P(C) ---- 1 V(R) 1 V(S) 0 P(R) -1
P(B) Y QB 0 P(S) -1 P(C) X QC -1 P(R) Z QR P(C)
Esta sincronización esta mal realizada ya que todos los procesos
terminan bloqueados.
12. Explique qué pasa con la rutina A:
P(R) P(S) P(T) .... V(T)
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-10-
V(S) V(R)
desde el momento en que en la ejecución de V(T) los valores de los
semáforos son T = -1, S = -1, R = 0, hasta que finalice ella de
ejecutarse íntegra.
T S R -1 -1 0 V(T) 0 -1 0 V(S 0 0 0 V(R) 0 0 1
Al finalizar la rutina A, los semáforos quedan con valores no
negativos, los cuales permiten volver a ejecutar la rutina.
13. Si la rutina de WAIT o P( ) que asocia un semáforo a una cola,
guarda los pedidos de espera en la
forma de pila (LIFO), ¿Qué problema puede acarrear? Respuesta: No
respetaría el orden de los pedidos y podría algún proceso padecer
inanición.
14. Dada la siguiente secuencia lógica y los valores
iniciales:
X Y Z Q P(B) P(S) P(C) P(D) P(T) ... ... ... ... ... ... ... V(C)
V(T) V(D) V(B) V(S)
Valores iniciales S =1, T=0, B=1, C=0, D=0. Explique cuál es la
secuencia normal de ejecución. Para encontrar la secuencia normal
de ejecución debemos seguir los valores de los semáforos
habilitados. Como S=1 y B=1 podríamos comenzar por la ejecución con
X, pasa el semáforo B y se bloquea en el semáforo T, por lo tanto
solo podrá ejecutar Y primero Y ,cuando este finaliza habilita el
sem. T entonces ejecuta X . este habilita el semáforo C , entonces
puede ejecutar Z, que habilita el sem D y puede ejecutar Q que deja
B=1 y S=1
la secuencia normal es YXZQ 15. Para calcular el número
combinatorio (n k) = n(n-1)(n-2)...(n-k+1)/k!, desarrollamos un
programa con
dos procesos. El proceso P1 calcula el numerador y deposita el
resultado en una variable compartida, denominada x, mientras que P2
calcula el factorial y deposita el valor en la variable y.
Sincronizar los procesos P1 y P2, utilizando semáforos, para que el
proceso P2 realice la división, es decir x/y.
Inicialización de variables globales y semáforos N, k, x=1, y=1,
enteros
P1 P2 For i= n – k +1 to n do { X = x + i; }
Y=:1 For j=2 to k do { y:=y * j; } escribir (x/y);
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-11-
RESPUESTA: Se Agrega el semáforo s inicializado en 0
Inicialización de variables globales y semáforos N, k, x=1, y=1,
enteros s:=0 : semáforos
P1 P2
For i= n – k +1 to n do { X = x + i; } Signal (s)
Y=:1 For j=2 to k do { y:=y*j; } wait (s); escribir (x/y);
16. Dada la siguiente situación:
Hay un puente colgante sobre el río, tan angosto que sólo una
persona puede cruzar a la vez. Implementar algún tipo de
sincronización para ordenar el paso por el puente y evitar también
la espera indefinida en una u otra orilla. Es un típico caso de
mutua exclusión, en dónde el puente es el recurso crítico que puede
ser usado sólo por un proceso (vehículo) a la vez. Los procesos 1 y
2, representan a los vehículos que pueden estar de un lado o del
otro. La solución para sincronizar el paso por el puente
sería:
P1 P2 while (1) { P(mutex) if(hay_autos()) /*puede no haber ningun
auto esperando*/ { entrar_en_puente () usar_puente () salir_puente
() } V(mutex) }
while (1) { P(mutex) if(hay_autos()) /*puede no haber ningun auto
esperando*/ { entrar_en_puente () usar_puente () salir_puente () }
V(mutex) }
17. Final:03/03/2001
Muestre en forma clara de que manera se ejecutarán los siguientes
procesos, considerando que se ejecutan en paralelo, y detalle que
procesos terminaron y cuales no y por que razón. Inicialización de
los semáforos: I, B, A, C, P = 0 M, K, G = 1
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-12-
P1 P2 P3 P4 P5 P6 D(I) D(M) U(B) D(A) U(C) D(K) U(I) U(A) D(C) D(A)
D(P) U(A) D(P) D(I) D(G) U(I) D(M) D(I) U(P) U(I) U(G) D(K) D(G)
U(I) D(K) D(K) U(K) U(M) D(M)
U(M) D(P) D(K) U(K)
A B C G I K M P P1 P2 P3 P4 P5 P6 0 0 0 1 0 1 1 0 1 U(B) -1 D(C)
P3->Qc (Blocked) 0 U(C) P3<-Qc (Ready) -1 D(P) P5->Qp
(Blocked) 0 D(G) 1 U(G) 0 D(K) 1 U(A) -1 D(I) P6->Qi (Blocked) 0
D(M) 2 U(A) -2 D(I) P2->Qi (Ready) 1 D(A) 0 D(A) -1 U(I)
P6<-Qi (Ready) -1 D(K) P4->Qk (Blocked) 0 U(I) P2<-Qi
(Ready) -1 D(M) P6->Qm (Blocked) 1 U(I) -2 D(K) P2->Qk
(Blocked) 0 D(I) 1 U(I) -2 D(P) P1->Qp (Blocked)
Bloqueados: Deadlock: P2, P6, P1, P5 Starvation: P4 Termina:
P3
18. Final 29/12/01
Resuelva la siguiente tabla sabiendo que el semáforos C esta
inicializado en 1 y el resto se encuentran en 0.
P1 P2 P3 P4 P5 D(M) D(E) D(R) D(B) D(C) D(I) D(B) D(I) D(C) U(A)
U(R) D(A) D(J) D(O) U(I) U(J) U(E) U(E) U(E) U(C) U(I) D(L) U(I)
D(P) U(M) U(P) U(A) U(B) U(L) U(O)
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-13-
A B C E I J L M O P R P1 P2 P3 P4 P5 0 0 1 0 0 0 0 0 0 0 0 0 D(C) 1
U(A) 1 U(I) 1 U(C) 1 U(M) 1 U(O) -1 D(R) P3->Qr -1 D(E)
P2->Qe 0 D(M) 0 D(I) 0 U(R) P3<-Qr 1 U(J) 1 U(I) 1 U(P) 0
D(I) 0 D(J) 0 U(E) P2<-Qe 1 U(I) 1 U(B) 0 D(B) 0 D(A) 1 U(E) -1
D(L) P2->Ql -1 D(B) P4->Qb
P2, P4 quedan bloqueados P1, P3 y P5 terminan.
19. Final 17/02/2001
De existir, muestre una secuencia de eventos para los cuales P1, y
P2 entran en DEADLOCK. Los semáforos son: s1, s2 (Semáforos
Mutex).
Void P1() { While(1) { Down (s1); Down (s2); Printf(“Bambu”); Up
(s1); Up (s2); } }
Void P2() { While(1) { Down (s2); Printf(“Guetzel”); Down (s1); Up
(s2); Up (s1); } }
El enunciado nos dice que ambos semáforos (s1 y s2) son Mutex. Esto
quiere decir que se encuentran inicializados en 1. Ambos procesos
(p1 y p2) se ejecutan al mismo tiempo. Cuando P1 ejecuta la
sentencia: Down (s1); S1 que estaba en 1 pasa a estar en 0 y
supongamos que en ese instante se le acaba el quantum de tiempo y
ejecuta P2 haciendo un Down (s2); S2 estaba en 1 pasa a estar en 0
y cuando P2 ejecute S1 queda bloqueado. Cuando le vuelve a tocar el
procesador a P1 ejecuta S2 y queda bloqueado Entonces ambos
procesos quedan en DEADLOCK
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-14-
20. En un sistema de computación real, ni los recursos disponibles
ni los requerimientos de los procesos por recursos se mantienen por
largo tiempo. Los recursos se rompen o son reemplazados, los
procesos vienen y van, se agregan nuevos recursos al sistema,
etc.
Si en tal sistema, los bloqueos se controlan con el algoritmo del
banquero, ¿cuáles de los siguientes cambios se puede hacer con
seguridad (sin introducir posibilidad de bloqueos) y bajo qué
circunstancias?: Incrementar AVAILABLE (se agregan nuevos
recursos). Decrementar AVAILABLE (se eliminan recursos del
sistema). Incrementar MAX para un proceso (el proceso necesita más
recursos que los permitidos). Decrementar MAX para un proceso (el
proceso decide que no va a necesitar algunos recursos). Incrementar
el número de procesos. Decrementar el número de procesos.
Consideraciones Previas: Algoritmo de comprobación de un estado
seguro: • Buscar fila F cuyas necesidades de recursos sean menores
que lso recursos disponibles. Si no hay
=> estado no seguro, el sistema se puede interbloquear, se
necesitan más de los disponibles • Suponer que el proceso de la
fila F pide todos los recursos y termina. Marcar el proceso
como
terminado y añadir sus recursos al vector de recursos disponibles.
• Repetir los dos pasos anteriores hasta terminar todos los
procesos. Si se puede terminar => estado
seguro. 21. Hallar la matriz de necesidad. Tener en cuenta que el
sistema usa el “Algoritmo del Banquero” para
bloquear a los procesos que piden más recursos que los disponibles.
Solo se asignara a un proceso los recursos que necesite, si estos
son todos los que va a necesitar para completar la ejecución. El
número de los procesos corresponde con el orden de llegada. Se
deberá utilizar el algoritmo de planificación FCFS. Además indicar
si el sistema es seguro o no (o sea verificar si ningún proceso
queda sin los recursos necesarios).
La Matriz de necesidad = M Peticiones Máximas – M Recursos
Asignados
Necesidad R1 R2 R3 R4 P1 2 0 1 2 P2 0 1 3 1 P3 0 0 3 5 P4 1 0 3 2
P5 2 1 0 2
Y el vector de recursos es:
Peticiones Máximas Disponibles Recursos Asignados R1 R2 R3 R4 R1 R2
R3 R4 R1 R2 R3 R4
P1 2 3 2 5 1 0 9 4 P1 0 3 1 3 P2 1 2 6 3 P2 1 1 3 2 P3 0 2 4 5 P3 0
2 1 0 P4 3 0 5 2 P4 2 0 2 0 P5 3 4 5 4 P5 1 3 5 2
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-15-
Recursos R1 R2 R3 R4 5 9 21 11
Debemos encontrar una secuencia en la que se terminen de ejecutar
todos los procesos para que no haya deadlock. Si utilizamos el
algogitmo FCFS, el primer proceso que debería ser atendido es P1
pero si esto sucede provocará interbloqueo. Ya que necesita 2
unidades de R1 y sólo hay una disponible. Si buscamos otra
secuencia, a simple vista nos parece que P4, P1, P5, P3, P2 es un
estado seguro. Vamos a comprobarlo. Luego de ejecutar P4 la matriz
de asignación es la siguiente:
R1 R2 R3 R4 P1 0 3 1 3 P2 1 1 3 2 P3 0 2 1 0 P4 0 0 0 0 P5 1 3 5
2
Cuando P4 devuelve sus recursos luego de ejecutar, la matriz de
recursos disponibles es la siguiente:
R1 R2 R3 R4 3 0 11 4
Luego de ejecutar P1 la matriz de asignación es la siguiente:
R1 R2 R3 R4 P1 0 0 0 0 P2 1 1 3 2 P3 0 2 1 0 P4 0 0 0 0 P5 1 3 5
2
Cuando P1 devuelve sus recursos luego de ejecutar, la matriz de
recursos disponibles es la siguiente:
R1 R2 R3 R4 3 3 12 7
Luego de ejecutar P5 la matriz de asignación es la siguiente:
R1 R2 R3 R4 P1 0 0 0 0 P2 1 1 3 2 P3 0 2 1 0 P4 0 0 0 0 P5 0 0 0
0
Cuando P5 devuelve sus recursos luego de ejecutar, la matriz de
recursos disponibles es la siguiente:
R1 R2 R3 R4 4 6 17 9
Luego de ejecutar P3 la matriz de asignación es la siguiente:
R1 R2 R3 R4
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-16-
P1 0 0 0 0 P2 1 1 3 2 P3 0 0 0 0 P4 0 0 0 0 P5 0 0 0 0
Cuando P3 devuelve sus recursos luego de ejecutar, la matriz de
recursos disponibles es la siguiente:
R1 R2 R3 R4 4 8 18 9
Luego de ejecutar P2 la matriz de asignación es la siguiente:
R1 R2 R3 R4 P1 0 0 0 0 P2 0 0 0 0 P3 0 0 0 0 P4 0 0 0 0 P5 0 0 0
0
Cuando P2 devuelve sus recursos luego de ejecutar, la matriz de
recursos disponibles es la siguiente:
R1 R2 R3 R4 5 9 21 11
La matriz final de recursos disponibles es igual al vector de
recursos, si el ejercicio está bien hecho. Hemos demostrado que
este estado es seguro para el sistema y que todos los procesos
finalizan su ejecución en esta secuencia.
22. Escribir un algoritmo para sincronizar el paso de vehículos
sobre un puente con una sola dirección de
circulación. Los vehículos arriban al puente pueden ir en ambas
direcciones, pero sólo pueden pasar de una dirección por vez. No
hay restricción acerca de la cantidad de vehículos que pueden estar
sobre el puente al mismo tiempo. ¿Hay starvation?; si la hay, ¿cómo
hacer pare evitarla? ¿Puede haber Deadlock? Explicar porqué.
a=1,b=0
P1 P2 while (1) { P(a) { if(hay_autos()) /*puede no haber ningun
auto esperando*/ { entrar_en_puente () usar_puente () salir_puente
() } } V(b) }
while (1) { P(b) { if(hay_autos()) /*puede no haber ningun auto
esperando*/ { entrar_en_puente () usar_puente () salir_puente () }
} V(a) }
Puede haber starvation si existiera la posibilidad de que haya
infinitos autos de un lado y nunca terminen de pasar. Y los que
están esperando del lado contrario nunca pueden empezar a pasar. En
este caso eso no puede ocurrir porque el sistema pregunta una vez
por lado alternadamente si hay
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-17-
autos, si no es así pasa al otro lado y si la respuesta es
afirmativa, deja pasar el auto correspondiente.
23. Se tienen 3 procesos: P1, P2 y P3: El código del proceso Pi
(i=1, 2, 3) es:
Pi( ) /*Proceso Pi con i=1,2,3 */ { while (TRUE) printf(“Soy el
proceso i \n”); } Se desea mostrar en la salida lo siguiente: Soy
el proceso 1 Soy el proceso 2 Soy el proceso 3 Soy el proceso 1 Soy
el proceso 2 …………………………… a) Sincronizar mediante semáforos. Definir
los semáforos e inicializarlos correctamente. Usar el
mínimo número de semáforos.
P(B) ----- V(C)
P(C) ----- V(A)
b) Reescriba los tres procesos con los semáforos
incorporados.
P1( ) { while (TRUE) P(A) printf(“Soy el proceso i \n”); V(B)
}
P2( ) { while (TRUE) P(B) printf(“Soy el proceso i \n”); V(C)
}
P3( ) { while (TRUE) P(C) printf(“Soy el proceso i \n”); V(A)
}
c) Sincronizar mediante mensajes. Se pide el mínimo código. ¿Cómo
parte? 24. Dados 4 procesos que cumplen las siguientes
funciones:
X Y Z W S1 S2 S1 S3
P S2
V3 V2 V1 V3 V V1
Los valores iniciales de los semáforos son S1=2 y S2=S3=1. Los
procesos siguen un orden del tipo YXZW.
Se pide, determinar la traza de ejecución y si los procesos
terminan o no.
S1 S2 S3 X Y Z W Q
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-18-
-2
Terminan Z,W. Bloqueados Y,X.
25. Dados los siguientes procesos con su respectivos códigos y los
valores iniciales de los semáforos A
=0, B= 1, C = 1, D=0.
X Y Z W P(C) P(D) P(C) P(A) P(D) P(A) P(B) ....... ........ .......
....... V(D) V(B) V(A) V(C)
Indique los procesos que terminaron (y en que orden) y los que no.
Secuencia: Y- Z - X -W.
A B C D X Y Z W Q 0 1 1 0 -1 P(D) Y->Qd 1
0 P(C) ----- V(A)
0 0
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-19-
26. Cambie los semáforos del ejercicio anterior para que el sistema
sea SEGURO y no quede ningún
proceso bloqueado. 27. Los siguientes procesos se ejecutan en
paralelo. Utilizando semáforos, especifique cuales terminaron
y cuales no.
Inicialización de los semáforos: I, B, A, C, P = 0 M, K, G =
1
P1 P2 P3 P4 P5 P6 D(I) D(M) U(B) D(A) U(C) D(K) U(I) U(A) D(C) D(A)
D(P) U(A) D(P) D(I) D(G) U(I) D(M) D(I) U(P) U(I) U(G) D(K) D(G)
U(I) D(K) D(K) U(K) U(M) D(M)
U(M) D(P) D(K) U(K) U(P) U(G) U(P)
A B C G I K M P P1 P2 P3 P4 P5 P6 0 0 0 1 0 1 1 0 1 U(C) -1 D(P)
P5->Qp 1 U(B) 0 D(C) 0 D(G) 1 U(G) 0 D(M) 1 U(A) -1 D(I)
P2->Qi 0 D(K) 2 U(A) -2 D(I) P6->Qi 1 D(A) 0 D(A) -1 U(I)
P2<-Qi -1 D(K) P4->Qk 0 U(I) P6<-Qi -2 D(K) P2->Qk 1
U(I) -1 D(M) P6->Qm 0 D(I) 1 U(I) -2 D(P) P1->Qp
Sólo P3 termina.
28. Realice la sincronización de 4 procesos
A ---> |____10______| --->BDBD(una vez cada uno, en ese
orden) ----->|colalimitada------> C
-Genera mensajes -Retira mensajes -Retira mensajes
-Deposita mensajes -Procesa el mens -Consume el mens.
-Deposita mens.
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-20-
vacio=10, lleno=0 a=1,b=0, lleno1=0
A B C D while (1) { m=generar() P(vacio) P(mutex) depositar(m)
V(mutex) V(lleno) }
while (1) { P(a) P(lleno) P(mutex) m=retirar() V(mutex) V(vacio)
procesar(m) P(mutex1) depositar(m) P(lleno1) V(mutex1) v(b) }
while (1) { P(b) P(lleno) P(mutex) m=retirar() V(mutex) V(vacio)
procesar(m) P(mutex1) depositar(m) P(lleno1) V(mutex1) v(a) }
while (1) { P(lleno1) P(mutex1) m=retirar() V(mutex1) consumir (m)
}
29. Realice la sincronización de 4 procesos
A ----> |______ilimitada____|
----->B--->|___5___|------> C y D (en forma alternada
estrictamente) -Genera mensajes - Retira mensajes -Retira mensajes
-Deposita mensajes - Procesa el mens -Consume el mens. - Deposita
mens.
lleno=0=lleno1, vacio=5 a=0,b=1
A B C D while (1) { m=generar() P(mutex) depositar(m) V(mutex)
V(lleno) }
while (1) { P(lleno) P(mutex) m=retirar() V(mutex) procesar(m)
P(vacio) P(mutex1) depositar(m) V(mutex1) V(lleno1) }
while (1) { P(b) P(lleno1) P(mutex1) m=retirar() V(mutex1) V(vacio)
consumir(m) V(a) }
while (1) { P(a) P(lleno1) P(mutex1) m=retirar() V(mutex1) V(vacio)
consumir (m) V(b) }
30. Tengo un proceso productor que deposita los mensajes en un
Buffer de 30 posiciones. Luego los
retira y los procesa otro proceso intermediario, que va depositando
los mensajes procesados en un Buffer de 5 posiciones otros dos
procesos C1 y C2 los retiran e Imprimen altenadamente , C1,C2,
C1,C2, C1,C2 etc. Realizar los algoritmos para los 4
procesos.
vacio=30,lleno=0,vacio1=5,lleno1=0,a=1,b=0
A B C D while(1) { m=producir()
while(1) { P(lleno)
while(1) { P(a)
while(1) { P(b)
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-21-
P(mutex) m=retirar() V(mutex) V(vacio) k=procesar(m) P(vacio1)
P(mutex1) depositar(k) V(mutex1) V(lleno1) }
P(lleno1) P(mutex1) k=retirar_k() V(mutex1) V(vacio1) consumir(k)
V(b) }
P(lleno1) P(mutex1) k=retirar_k() V(mutex1) V(vacio1) consumir(k)
V(a) }
31. Dado el siguiente grafo de asignación de recursos seleccione la
opción correcta, justificando su
elección. r1 r2
P5
a) El grafo tiene un ciclo y por tanto se puede asegurar que no
existe interbloqueo (Deadlock). b) El grafo tiene un ciclo y por
tanto se puede asegurar que existe interbloqueo. c) Existe una
secuencia en la terminación de procesos que no produce
interbloqueo. d) Ninguna es correcta. JUSTIFIQUE RESPUESTA: C Si
Termina P5, P4, P3, P2, P1 tengo una secuencia de ejecución donde
no hay deadlock, (Hay otras más) Podemos armar las matrices de
asignación y necesidad de la siguiente manera: M Asignación M
Necesidad
R1 R2 R3 R4 R5 R1 R2 R3 R4 R5 P1 1 0 0 0 0 P1 0 0 1 0 0 P2 0 1 0 1
0 P2 1 0 0 0 0 P3 1 0 1 0 0 P3 0 0 0 0 1 P4 0 0 0 0 1 P4 0 1 0 0 0
P5 0 1 0 0 1 P5 0 0 0 0 0
El vector de recursos disponibles es:
R1 R2 R3 R4 R5 0 0 0 0 0
Y el vector de recursos es:
R1 R2 R3 R4 R5 2 2 1 1 2
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-22-
Debemos encontrar una secuencia en la que se terminen de ejecutar
todos los procesos para que no haya deadlock. A simple vista nos
parece que la secuencia P5, P4, P3, P2, P1 es un estado seguro.
Vamos a comprobarlo. Luego de ejecutar P5 la matriz de asignación
es la siguiente:
R1 R2 R3 R4 R5 P1 1 0 0 0 0 P2 0 1 0 1 0 P3 1 0 1 0 0 P4 0 0 0 0 1
P5 0 0 0 0 0
Cuando P5 devuelve sus recursos luego de ejecutar, la matriz de
recursos disponibles es la siguiente:
R1 R2 R3 R4 R5 0 1 0 0 1
Luego de ejecutar P4 la matriz de asignación es la siguiente:
R1 R2 R3 R4 R5 P1 1 0 0 0 0 P2 0 1 0 1 0 P3 1 0 1 0 0 P4 0 0 0 0 0
P5 0 0 0 0 0
Cuando P4 devuelve sus recursos luego de ejecutar, la matriz de
recursos disponibles es la siguiente:
R1 R2 R3 R4 R5 0 1 0 0 2
Luego de ejecutar P3 la matriz de asignación es la siguiente:
R1 R2 R3 R4 R5 P1 1 0 0 0 0 P2 0 1 0 1 0 P3 0 0 0 0 0 P4 0 0 0 0 0
P5 0 0 0 0 0
Cuando P3 devuelve sus recursos luego de ejecutar, la matriz de
recursos disponibles es la siguiente:
R1 R2 R3 R4 R5 1 1 1 0 2
Luego de ejecutar P2 la matriz de asignación es la siguiente:
R1 R2 R3 R4 R5 P1 1 0 0 0 0 P2 0 0 0 0 0 P3 0 0 0 0 0 P4 0 0 0 0 0
P5 0 0 0 0 0
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-23-
Cuando P3 devuelve sus recursos luego de ejecutar, la matriz de
recursos disponibles es la siguiente:
R1 R2 R3 R4 R5 1 2 1 1 2
Luego de ejecutar P1 la matriz de asignación es la siguiente:
R1 R2 R3 R4 R5 P1 0 0 0 0 0 P2 0 0 0 0 0 P3 0 0 0 0 0 P4 0 0 0 0 0
P5 0 0 0 0 0
Cuando P1 devuelve sus recursos luego de ejecutar, la matriz de
recursos disponibles es la siguiente:
R1 R2 R3 R4 R5 2 2 1 1 2
La matriz final de recursos disponibles es igual al vector de
recursos, si el ejercicio está bien hecho. Hemos demostrado que
este estado es seguro para el sistema y que todos los procesos
finalizan su ejecución en esta secuencia.
32. Final 03/03/2007 (ej 1)
Considere que estos 4 procesos se están ejecutando
concurrentemente, y que en el. Sistema existen 4 semáforos
inicializados en 1. Dada la siguiente secuencia de ejecución se
pide determinar los posibles estados del sistema, justificando su
respuesta en cada caso. Si existiera la posibilidad de que se
produzca deadlock indique entre que procesos y con que
recursos.
P1 P2 P3 P4 P(S) P(X) P(U) P(T) P(T) P(U) P(S) P(X) P(S) P(X) … …
……. … V(S) V(X) V(T) V(U) V(U) V(T) V(S) V(X)
Hay diferentes secuencias de ejecución que producen resultados
distintos, basta con explicar alguna. a) Si ejecuta el P1 ,P2,P3;P4
en forma completa hasta bloquearse
S T U X P1 P2 P3 P4 Q Estado 1 1 1 1 0 P(S) 0 P(T) -1 P(S)
P1->Qs BLOQ 0 P(X) 0 P(U) -1 P(X) P2->Qx BLOQ -1 P(U)
P3->Qu BLOQ -1 P(T) P4->Qt BLOQ
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-24-
El Proceso P1 y P2 padecen inanición ya que no hay suficientes
recursos y no hay espera circular no se cumplen las condiciones del
Deadlock
En este caso.
b) Otra forma de ejecución es que cada uno ejecute una instrucción
y pase a otro proceso.
S T U X P1 P2 P3 P4 Q Estado 1 1 1 1 0 P(S) 0 P(X) 0 P(U) 0 P(T) -1
P(T) P1->Qt BLOQ -1 P(U) P2->Qu BLOQ -1 P(S) P3->Qs BLOQ
-1 P(X) P4->Qx BLOQ
Si se produce esta secuencia y de esta forma è hay deadlock 33.
Final 18/02/2006 (ej c2)
Indicando la traza de ejecución, muestre en forma CLARA de que
manera se ejecutarán los siguientes procesos, considerando que lo
hacen concurrentemente en un sistema multiprogramado. Detalle que
procesos finalizaron y cuáles no y por que razón. Para que se
considere aprobado el punto deberá justificar su conclusión con un
grafo de asignación de recursos, caso contrario el ejercicio se
evaluará como incorrecto en su TOTALIDAD. Adicionalmente, considere
que el sistema operativo no libera los recursos que tienen
asignados los procesos cuando finalizan. Inicialización de los
semáforos: I, B, A, C, P = 0 M, K, G = 1
P1 P2 P3 P4 P5 P6
D ( I ) D ( M ) U ( B ) D ( A ) U ( C ) D ( K ) U ( I ) U ( A ) D (
C ) D ( A ) D ( B ) U ( A )
D ( P ) D ( I ) D ( G ) U ( I ) D ( M ) D ( I ) U ( P ) U ( I ) U (
G ) D ( K ) D ( G ) U ( I ) D ( K ) D ( K ) U ( K ) U ( M ) D ( M
)
U ( M ) D ( P ) D ( K ) U ( K) U ( P ) U ( G ) U ( P )
SEMAFOROS Instante READY QUEUE RUN-
NING I B A C P M K G
COLA DE SEM. Estado
Inicial P1,P2,P3,P4,P5,P6 ______ 0 0 0 0 0 1 1 1 ____ _____
t1 P2,P3,P4,P5,P6 P1(DI) -1 I={P1} P1 = Blocked
T2 P3,P4,P5,P6 P2(DM) 0 M={}
T3 P3,P4,P5,P6 P2(UA) 1 A={}
T4 P3,P4,P5,P6 P2(DI) -2 I={P1,P2} P2 = Blocked
T5 P4,P5,P6 P3(UB) 1 B={}
T6 P4,P5,P6 P3(DC) -1 C={P3} P3 = Blocked
T7 P5,P6 P4(DA) 0 A={}
T8 P5,P6 P4(DA) -1 A={P4} P4 = Blocked
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-25-
t10 P6, P3 P5(DB) 0 B={}
t11 P6, P3 P5(DM) -1 M={P5} P5 = Blocked
t12 P3 P6(DK) 0 K ={}
t13 P3 P6(UA) 0 A ={} P4 = Ready
t14 P3,P4 P6(DI) -3 I={P1,P2,P6} P5 = Blocked
t15 P4 P3(DG) 0 G={}
t16 P4 P3(UG) 1 G={} P3 = TERMINA
t17 VACIA P4(UI) -2 I={P2,P6} P1 = Ready
t18 P1 P4(DK) -1 K ={P4} P4 = Blocked
t19 VACIA P1(UI) -1 I={P6} P2 = Ready
T20 P2 P1(DP) -1 P={P1} P1 = Blocked
T21 VACIA P2(UI) 0 I={} P6 = Ready
T22 P6 P2(DK) -2 K ={P4,P2} P2 = Blocked
T23 VACIA P6(UI) 1 I={}
T24 VACIA P6(DM) -2 M={P6} P6 = Blocked
PROCESO P3 TERMINA EN EL INSTANTE 16
PROCESO P1 ESTA BLOQUEADO ESPERANDO QUE SE LIBRE EL RECURSO P
PROCESO P5 ESTA BLOQUEADO ESPERANDO QUE SE LIBRE EL RECURSO M
PROCESO P3 ESTA BLOQUEADO ESPERANDO QUE SE LIBRE EL RECURSO K
LOS PROCESOS P2 Y P6 ESTAN EN DEADLOCK
OBSERVACIÓN: Los procesos P1, P4 Y P5 ESTAN BLOQUEADOS aunque la
liberación de recursos ( P, B y A) depende del orden de ejecución
externa o de los procesos involucrados en el conflicto,
técnicamente no están involucrados en el DEADLOCK como sí lo están
M y K
34. Final 17/02/2007 (ej 1)
En un Depósito hay un montacargas para distribuir la mercadería en
los dos sectores del 1er piso. El empleado de depósito carga un
paquete y lo coloca en el montacargas y los empleados de los
sectores A y B los retiran. Siempre deben retirar 3 paquetes el
empleado del sector A y luego 1 paquetes el empleado del sector B ,
3 del A y 1 del B y así sucesivamente. El ascensor puede cargar
hasta 20 paquetes e inicialmente está vacío.
1.1 Realizar la sincronización con semáforos (sin pseudo código) de
los tres procesos. D, A y B
D |________20______| AAABAAAB vacio=20 lleno=0 a=3 b=0 mutex
D A B Do while (t) { traer_paquete() P(vacio) P(mutex)
Cargar_paq_montacargas() V(mutex) V(lleno) }
Do while(t) { P(a) P(lleno) Retirar_paq_montacargas () V(mutex)
V(vacio) Llevar_paquete_al_sector()
Do while (t) { P(b) P(b) P(b) P(lleno) V(mutex)
Retirar_paquete_montacargas() V(mutex)
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-26-
} V(vacio) V(a) V(a) V(a) Llevar_paquete_al _sector() }
1.2 Hacer una prueba de escritorio donde el orden de ejecución .sea
D D D D D D D D A B A para mostrar que la sincronización
funciona.
vacio lleno mutex a b D A B Colas 20 0 1 3 0 19 P(vacio) 0 P(mutex)
1 V(mutex) 1 V(lleno) 18 P(vacio) 0 P(mutex) 1 V(mutex) 2 V(lleno)
17 P(vacio) 0 P(mutex) 1 V(mutex) 3 V(lleno) 16 P(vacio) 0 P(mutex)
1 V(mutex) 4 V(lleno) 15 P(vacio) 0 P(mutex) 1 V(mutex) 5 V(lleno)
2 P(a) 4 P(lleno) 0 P(mutex) 1 V(mutex) 16 V(vacio) 1 V(b) 0 P(b)
-1 P(b) B Qb (Bloqueado) 1 P(a) 3 P(lleno) 0 P(mutex) 1 V(mutex) 17
V(vacio) 0 V(b) B Qb ( Ready)
35. Los organizadores del próximo mundial de fútbol 5 se encuentran
desarrollando una aplicación que simule los penales que se
producirán en los partidos que se llevarán a cabo durante 1
campeonato. Pero están teniendo inconvenientes, ya que han definido
3 tipos de procesos que se ejecutan en forma concurrente y no loran
sincronizar los mismos. Para ser un poco más ordenados, se
han
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-27-
definido una serie de reglas que se deberán cumplir, y a su vez
definieron un pseudo código que es una primera aproximación para
poder resolver la simulación. A continuación se detallan las reglas
que se tienen que cumplir para que puedan lograr una correcta
simulación: • Existen 5 jugadores y un arquero • Los jugadores no
pueden patear si el árbitro no lo indicó • El arquero no debe
atajar si el árbitro no da la orden • Sólo se deben usar semáforos,
indicando el tipo y los valores iniciales • Se debe sincronizar el
orden en que patean los jugadores • El árbitro no debe dar el
pitido hasta que los 2 jugadores no estén posicionados en sus
respectivos lugares. • Existe una variable global GOL que indica si
el último penal pateado fue gol o no • Una vez que se valide el
penal, se pasará el turno al próximo patearodr • Se tiene una
función “Siguiente ()” que cuando es invocada por los procesos
retorna el
identificador del próximo pateador y la función “Actual()” que
retorna el identificador del jugador actual.
Ésta es la solución implementada con semáforos mutex, dadas las
reglas del ejercicio se utiliza un vector de semáforos (turno) para
sincronizar el turno de cada jugador, y que éstos no se salteen, el
resto de los semáforos solo son para la sincronización de la acción
de cada proceso durante el penal. SEMAFOROS:
jugEnPos=arqEnPos=Tiro=Atajada=ValidacionJ=ValidacionA=0 Turno[5] =
{1}
Arbitro Jugador Arquero While (1) { wait(arqEnPos); wait(jugEnPos);
darOrden(); signal (orden); wait(atajada) ; validar_tiro();
signal(ValidacionJ); signal(ValidacionJ); }
While(1) { wait(turno[Actual()]); posicionarse(); signal(jugEnPos);
wait(orden); patear(); signal(Tiro); wait(ValidacionJ) ;
if(GOL=TRUE) festejar(); else lamentarse();
signal(turno[Siguiente()]) }
While(1) { ubicarse(); signal(arqEnPos); wait(Tiro); atajar();
signal(atajada); wait(ValidacionA) ; if(GOL=TRUE) lamentarse();
else festejar(); }
36. Un pequeño centro de sky cuenta con una aerosilla con capacidad
para una sola persona. Si se tiene
los seudo códigos de los procesos aerosilla u esquiador, se pide
que sincronice convenientemente usando semáforos para que no
produzca Deadlock ni Starvation.
Semáforos mutex: base=1;silla=0;cima=0
Void esquiador () { while (1) { llegar_a_la_aerosilla(); wait(base)
; subir_a_la_aerosilla(); signal(silla); wait(cima);
bajar_de_la_aerosilla(); signal(silla);
Void Aerosilla() { while(1) { wait(silla); subir_la_montaña();
signal(cima); wait(silla); bajar_la_montaña(); signal (base);
}
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-28-
bajar_esquiado(); } }
}
Esquiador Aerosilla Silla Cima Base Llegar_a_la_aerosilla()
W(silla) 0 0 1 W(base) 0 0 1 Subir_a_la_aerosilla() 0 0 0 S(silla)
0 0 0 W(cima) Subir_a_la_montaña() 1 0 0 S(cima) 0 0 0
Bajar_de_la_aerosilla W(silla) 0 1 0 S(silla) 0 0 0
Bajar_esquiando() Bajar_la_montaña() 1 0 0 S(base) 0 0 1
37. Cuatro alumnos están jugando en clase un juego de cartas que
implica coordinación (no saltearse los
turnos) y exclusión mutua (mientras uno toma una carta o la cambia
con el compañero el resto debe esperar a que finalice para no
quitarse la carta de la mano). Se plantea tomar como base esta
experiencia para implementar una arquitectura de comunicación entre
procesos que permita realizar una práctica de inteligencia
artificial en la que cada alumno codificará su estrategia dentro de
las siguientes funciones aisladas. Proceso_jugador() { while(1) {
pensar_la_jugada(); wait(esperar[IDENTIFICACION_DE_JUGADOR]);
jugar(); signal(esperar[SIGUIENTE(IDENTIFICACION_DE_JUGADOR)]); } }
Todos los procesos serán hijos de un procesos principal denominado
partida, y por lo tanto heredarán a través de la función fork() y
exec() correspondiente una serie de semáforos inicializados de la
siguiente manera: #define NUMERO_DE_JUGADORES 4 #define
NUMERO_DE_CARTAS 40 #define SIGUIENTE(IDENTIFICACION_DE_JUGADOR)
((IDENTIFICACION_DE_JUGADOR + 1)/NUMERO_DE_JUGADORES) Se pide: a)
Intercalar en el código propuesto para cada proceso_jugador() las
funciones wait y signal
necesarias sobre los semáforos esperar [IDENTIFICACION_DE_JUGADOR]
y esperar[SIGUIENTE(IDENTIFICACION_DE_JUGADOR)] para asegurar el
correcto funcionamiento del mismo, es decir, que cada jugador deba
esperar su turno antes de poder ejecutar jugar ().
b) ¿Cómo debe estar inicializado el array de semáforos para que
funcione, es decir, empiece el primer jugador y ceda el turno al
siguiente y así sucesivamente, quedando bloqueado cada cual hasta
que le toque el turno? Rta: Esperar[1,0,0,0]
c) En el caso que jugar() no se ejecute de forma atómica, ya que
tendrá que modificar al menos dos entradas de la tabla carta,
¿habría que incorporar algo para garantizar la exclusión mutua en
la ejecución de jugar()?. De ser necesario, escribir el código. De
no serlo, explique porqué. Rta: No es necesario porque wait y
signal se ejecutan de forma atómica, por lo tanto se
garantiza
UTN - FRBA Sistemas Operativos
Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2
Sincronización
-29-
la exclusión mutua de la ejecución jugar. Para que se ejecute esa
sentencia cada proceso debe esperar a q se habilite el respectivo
semáforo del cual está haciendo el wait.
Esperar P0 P1 P2 P3 0 1 2 3