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 UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización Sincronización Consideraciones Previas 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,} W(A) = {c,h} R(B) = {x,k,m,c} W(B) = {m} Entonces: R(A) ∩ W(B) =Ø W(A) ∩ W(B) =Ø R(B) ∩ W(A) = {c} 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 A B C BLOCK En este instante A que está en ejecución hace TSL (ocupado) dejando ocupado = 1 READY B C, A BLOCK Luego pasa B a ejecución y hace TSL (ocupado) quedando en espera activa. Luego bloqueados a Listos, ubicándose detrás de A en la cola. -2- C pasa de UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización Cuando se le acaba el quantum de tiempo a B pasa a Listos y A a ejecución. READY B, C A 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 c=b+d h=c+f+g print c B m=6*x+k print m/c 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 -3- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas S1 P(a) ----V(b1) V(b2) V(b3) S2 P(b1) ----V(c1) V(c2) S3 P(b2) ----V(d3) S4 P(b3) ----V(d4) S5 P(c1) ----V(d1) S6 P(c2) ----V(d2) Guía nº 2 Sincronización S7 P(d1) P(d2) P(d3) P(d4) -----V(a) 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=199 X=x+1 Print (X) 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=199 X=x+1 Print (X) V(mutex) 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 P(s) X=199 X=x+1 Print (X) V(k) B 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… A P(s) -------------V(k) B P(k) ---------V(r) C 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… -4- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas B P(b) ------- C P(c) ------- V(c) V(b) Guía nº 2 Sincronización Para comenzar con B el valor inicial de b=k=1, c=s=0 A P(s) ------- B P(b) P(k) ------V(c) V(s) V(k) C 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 1 0 b 1 c 0 s A C Q P(b) P(k) ----V(c) V(s) 0 1 1 0 1 P(s) ----V(k) -1 P(b) 0 0 1 0 B->Qb P(c) P(k) ------V(b) V(s) 0 1 B 0 B<-Qb P(s) ---V(k) 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 -5- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas A P(k) ------- X P(s) ------- V(s) V(k) B P(s) ------- C P(s) ------- V(k) V(k) Guía nº 2 Sincronización Entonces combinamos las dos soluciones: A P(k) ------- B P(s) ------- C P(s) ------- V(s) V(k) V(k) Para comenzar con el proceso A inicializamos k=1 y s=0 k 1 0 s 0 1 0 A B C P(s) ----V(k) P(s) ---V(k) P(k) ---V(s) 1 8. Colocar los semáforos de tal manera que los procesos A, B, C ejecuten siempre en la secuencia A(ByC)A(ByC)… A P(k) P(k) ------- B P(s) ------- C P(a) ------- V(k) V(k) V(s) V(a) 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) -6- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas While (TRUE) { m = 2 * x – n; imprimir (m); } Guía nº 2 Sincronización Declaración, Inicialización de Variables y Semáforos var x: entero P1 P2 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) while (TRUE) { { P(s) P(k) m = 2 * x – n; leer_teclado (d); imprimir (m); x := d – c * 5; V(k) 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 n=0 While (TRUE) while (TRUE) { { P(s) P(K) m = 2 * x – n; n++; imprimir (m); leer_teclado (d); V(K) x := d – c * 5; } if (n mod(2)=0) v(k); else V(s); } n es una variable local a P2 Otra solución: While (TRUE) { P(s) P(s) m = 2 * x – n; imprimir (m); V(K) V(K) Declaración, Inicialización de Variables y Semáforos var x: entero P1 P2 while (TRUE) { P(K) leer_teclado (d); x := d – c * 5; V(s); } -7- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización } K=2, s=1 para que la primera vez ejecute. 10.Se tienen 2 procesos paralelos: int x = 0; Proceso A Proceso B { while (TRUE) x = x + 1; } { 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 while (TRUE) { P(s) x = x + 1; V(k) Proceso B 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 while (TRUE) { P(s) x = x + 1; V(k) } s 1 0 k 2 3 2 1 0 Proceso B while (TRUE) { P(k) P(k) P(k) print (x); V(s) V(s) V(s) } A B P(s) ---V(k) P(k) P(k) P(k) ---- -8- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas 1 2 3 2 V(s) V(s) V(s) 1 1 2 0 3 2 1 0 1 2 3 Guía nº 2 Sincronización P(s) ---V(k) P(s) ---V(k) P(s) ---V(k) 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 P(S) P(C) Y P(R) P(B) V(R) V(S) V(B) V(S) Z 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) -9- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización 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. V(T) V(S V(R) T -1 0 0 0 S -1 -1 0 0 R 0 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 P(B) P(T) ... V(C) Y P(S) ... ... V(T) Z P(C) ... ... V(D) Q P(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 For i= n – k +1 to n do { X = x + i; P2 Y=:1 For j=2 to k do { y:=y * j; } } escribir (x/y); -10- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización 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 For i= n – k +1 to n do { X = x + i; P2 Y=:1 For j=2 to k do { y:=y*j; } Signal (s) } 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 while (1) { P(mutex) if(hay_autos()) /*puede no haber ningun auto esperando*/ { entrar_en_puente () usar_puente () salir_puente () } V(mutex) } P2 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 -11- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas P1 D(I) U(I) D(P) U(P) D(K) A 0 B 0 1 C 0 P3 U(B) D(C) D(G) U(G) P2 D(M) U(A) D(I) U(I) D(K) U(M) G 1 I 0 K 1 M 1 P 0 P1 Guía nº 2 Sincronización P4 D(A) D(A) U(I) D(K) U(K) D(P) P2 P3 P4 P5 U(C) D(P) D(M) D(G) U(M) D(K) P5 P6 U(B) D(C) -1 0 P3->Qc (Blocked) P3<-Qc (Ready) P5->Qp (Blocked) U(C) D(P) -1 0 1 P6 D(K) U(A) D(I) U(I) D(M) U(K) D(G) U(G) 0 D(K) U(A) D(I) 1 -1 0 D(M) U(A) D(I) 2 -2 1 0 P2->Qi (Ready) D(A) D(A) U(I) D(K) -1 -1 P6<-Qi (Ready) P4->Qk (Blocked) U(I) P2<-Qi (Ready) D(M) P6->Qm (Blocked) 0 -1 1 U(I) D(K) -2 0 1 -2 P6->Qi (Blocked) P2->Qk (Blocked) D(I) U(I) 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 D(M) D(I) U(R) U(J) U(I) U(P) P2 D(E) D(B) D(A) U(E) D(L) U(A) P3 D(R) D(I) D(J) U(E) U(I) U(B) -12- P4 D(B) D(C) D(O) U(E) D(P) U(L) P5 D(C) U(A) U(I) U(C) U(M) U(O) UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas A B C 0 0 1 0 1 E 0 I 0 J 0 L M O P R 0 0 0 0 0 P1 P2 P3 Guía nº 2 Sincronización P4 D(C) U(A) U(I) U(C) U(M) U(O) 1 1 1 1 -1 D(R) -1 P3->Qr P2->Qe D(E) 0 0 0 1 1 1 D(M) D(I) U(R) U(J) U(I) U(P) P3<-Qr 0 D(I) D(J) U(E) U(I) U(B) 0 0 1 1 0 0 1 -1 P5 P2<-Qe D(B) D(A) U(E) D(L) -1 D(B) P2->Ql 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 -13- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización 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). P1 P2 P3 P4 P5 Peticiones Máximas R1 R2 R3 R4 2 3 2 5 1 2 6 3 0 2 4 5 3 0 5 2 3 4 5 4 R1 1 Disponibles R2 R3 0 9 R4 4 P1 P2 P3 P4 P5 La Matriz de necesidad = M Peticiones Máximas – M Recursos Asignados P1 P2 P3 P4 P5 R1 2 0 0 1 2 Necesidad R2 R3 0 1 1 3 0 3 0 3 1 0 R4 2 1 5 2 2 Y el vector de recursos es: -14- Recursos Asignados R1 R2 R3 R4 0 3 1 3 1 1 3 2 0 2 1 0 2 0 2 0 1 3 5 2 UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas R1 5 Guía nº 2 Sincronización Recursos R2 R3 R4 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: P1 P2 P3 P4 P5 R1 0 1 0 0 1 R2 3 1 2 0 3 R3 1 3 1 0 5 R4 3 2 0 0 2 Cuando P4 devuelve sus recursos luego de ejecutar, la matriz de recursos disponibles es la siguiente: R1 3 R2 0 R3 11 R4 4 Luego de ejecutar P1 la matriz de asignación es la siguiente: P1 P2 P3 P4 P5 R1 0 1 0 0 1 R2 0 1 2 0 3 R3 0 3 1 0 5 R4 0 2 0 0 2 Cuando P1 devuelve sus recursos luego de ejecutar, la matriz de recursos disponibles es la siguiente: R1 3 R2 3 R3 12 R4 7 Luego de ejecutar P5 la matriz de asignación es la siguiente: P1 P2 P3 P4 P5 R1 0 1 0 0 0 R2 0 1 2 0 0 R3 0 3 1 0 0 R4 0 2 0 0 0 Cuando P5 devuelve sus recursos luego de ejecutar, la matriz de recursos disponibles es la siguiente: R1 4 R2 6 R3 17 R4 9 Luego de ejecutar P3 la matriz de asignación es la siguiente: R1 R2 R3 R4 -15- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas P1 P2 P3 P4 P5 0 1 0 0 0 0 1 0 0 0 0 3 0 0 0 Guía nº 2 Sincronización 0 2 0 0 0 Cuando P3 devuelve sus recursos luego de ejecutar, la matriz de recursos disponibles es la siguiente: R1 4 R2 8 R3 18 R4 9 Luego de ejecutar P2 la matriz de asignación es la siguiente: P1 P2 P3 P4 P5 R1 0 0 0 0 0 R2 0 0 0 0 0 R3 0 0 0 0 0 R4 0 0 0 0 0 Cuando P2 devuelve sus recursos luego de ejecutar, la matriz de recursos disponibles es la siguiente: R1 5 R2 9 R3 21 R4 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(b) { if(hay_autos()) /*puede no haber ningun auto esperando*/ { entrar_en_puente () usar_puente () salir_puente () } } V(a) } while (1) { P(a) { if(hay_autos()) /*puede no haber ningun auto esperando*/ { entrar_en_puente () usar_puente () salir_puente () } } V(b) } 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 -16- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización 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. A=1,B=0,C=0 P1 P(A) ---V(B) P2 P(B) ----V(C) P3 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) } c) 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) } Sincronizar mediante mensajes. Se pide el mínimo código. ¿Cómo parte? 24.Dados 4 procesos que cumplen las siguientes funciones: P X S1 Y S2 S2 S3 V3 V2 V Z S1 W S3 V1 V3 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 -17- Z W Q UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas 2 1 0 Guía nº 2 Sincronización 1 P(S2) P(S3) ------V(S2) 0 1 1 P(S1) P(S2) ------V(S3) 0 1 0 P(S1) -----V(S1) V(S1) 1 2 0 P(S3) -----V(S3) 1 -1 P(S2) 1 Y->Qs2 P(S1) P(S2) -2 X->Qs2 0 P(S1) -----V(S1) V(S1) 1 2 0 P(S3) -----V(S3) 1 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 P(C) Y P(D) P(D) ....... P(A) ........ V(D) V(B) Z P(C) ....... V(A) W P(A) P(B) ....... V(C) Indique los procesos que terminaron (y en que orden) y los que no. Secuencia: Y- Z - X -W. A 0 B 1 C 1 D 0 -1 X Y W P(D) 0 Q Y->Qd P(C) ----V(A) 1 -1 Z P(C) X->Qc 0 P(A) P(B) ----V(C) 0 0 Terminan Z, W. Bloqueados Y, X. -18- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización 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: P1 D(I) U(I) D(P) U(P) D(K) A B C G 0 0 0 1 1 I, B, A, C, P = 0 P2 D(M) U(A) D(I) U(I) D(K) U(M) I 0 K M P 1 1 0 P3 U(B) D(C) D(G) U(G) P1 M, K, G = 1 P4 D(A) D(A) U(I) D(K) U(K) D(P) U(P) P3 P2 P5 U(C) D(P) D(M) D(G) U(M) D(K) U(G) P4 P5 P6 D(K) U(A) D(I) U(I) D(M) U(K) U(P) P6 U(C) D(P) -1 1 P5->Qp U(B) D(C) D(G) U(G) 0 0 1 0 D(M) U(A) D(I) 1 -1 P2->Qi 0 D(K) U(A) D(I) 2 -2 1 0 D(A) D(A) U(I) D(K) -1 -1 0 P2<-Qi P4->Qk P6<-Qi P2->Qk U(I) D(K) -2 1 U(I) D(M) -1 0 1 -2 D(I) U(I) D(P) P6->Qi P6->Qm 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. -19- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización vacio=10, lleno=0 a=1,b=0, lleno1=0 A while (1) { m=generar() P(vacio) P(mutex) depositar(m) V(mutex) V(lleno) } B 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) } C 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) } D 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 while (1) while (1) { { m=generar() P(lleno) P(mutex) P(mutex) depositar(m) m=retirar() V(mutex) V(mutex) V(lleno) procesar(m) } P(vacio) P(mutex1) depositar(m) V(mutex1) V(lleno1) } C while (1) { P(b) P(lleno1) P(mutex1) m=retirar() V(mutex1) V(vacio) consumir(m) V(a) } D 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 while(1) { m=producir() B while(1) { P(lleno) C while(1) { P(a) -20- D while(1) { P(b) UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas P(vacio) P(mutex) depositar(m) V(mutex) V(lleno) P(mutex) m=retirar() V(mutex) V(vacio) k=procesar(m) P(vacio1) P(mutex1) depositar(k) V(mutex1) V(lleno1) } Guía nº 2 Sincronización 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 P2 P1 r3 r4 P4 P3 P5 r5 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 R1 R2 0 P1 1 1 P2 0 0 P3 1 0 P4 0 1 P5 0 R3 0 0 1 0 0 R4 0 1 0 0 0 R5 0 0 0 1 1 M Necesidad R1 R2 0 P1 0 0 P2 1 0 P3 0 1 P4 0 0 P5 0 El vector de recursos disponibles es: R1 0 R2 0 R3 0 R4 0 R5 0 Y el vector de recursos es: R1 2 R2 2 R3 1 R4 1 R5 2 -21- R3 1 0 0 0 0 R4 0 0 0 0 0 R5 0 0 1 0 0 UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización 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: P1 P2 P3 P4 P5 R1 1 0 1 0 0 R2 0 1 0 0 0 R3 0 0 1 0 0 R4 0 1 0 0 0 R5 0 0 0 1 0 Cuando P5 devuelve sus recursos luego de ejecutar, la matriz de recursos disponibles es la siguiente: R1 0 R2 1 R3 0 R4 0 R5 1 Luego de ejecutar P4 la matriz de asignación es la siguiente: P1 P2 P3 P4 P5 R1 1 0 1 0 0 R2 0 1 0 0 0 R3 0 0 1 0 0 R4 0 1 0 0 0 R5 0 0 0 0 0 Cuando P4 devuelve sus recursos luego de ejecutar, la matriz de recursos disponibles es la siguiente: R1 0 R2 1 R3 0 R4 0 R5 2 Luego de ejecutar P3 la matriz de asignación es la siguiente: P1 P2 P3 P4 P5 R1 1 0 0 0 0 R2 0 1 0 0 0 R3 0 0 0 0 0 R4 0 1 0 0 0 R5 0 0 0 0 0 Cuando P3 devuelve sus recursos luego de ejecutar, la matriz de recursos disponibles es la siguiente: R1 1 R2 1 R3 1 R4 0 R5 2 Luego de ejecutar P2 la matriz de asignación es la siguiente: P1 P2 P3 P4 P5 R1 1 0 0 0 0 R2 0 0 0 0 0 R3 0 0 0 0 0 R4 0 0 0 0 0 R5 0 0 0 0 0 -22- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización Cuando P3 devuelve sus recursos luego de ejecutar, la matriz de recursos disponibles es la siguiente: R1 1 R2 2 R3 1 R4 1 R5 2 Luego de ejecutar P1 la matriz de asignación es la siguiente: P1 P2 P3 P4 P5 R1 0 0 0 0 0 R2 0 0 0 0 0 R3 0 0 0 0 0 R4 0 0 0 0 0 R5 0 0 0 0 0 Cuando P1 devuelve sus recursos luego de ejecutar, la matriz de recursos disponibles es la siguiente: R1 2 R2 2 R3 1 R4 1 R5 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 P(S) P(T) P(S) ……. V(T) V(S) P2 P(X) P(U) P(X) … V(U) V(X) P3 P(U) P(S) … V(S) V(U) P4 P(T) P(X) … V(X) V(T) 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 1 0 T 1 U 1 X 1 P1 P2 P3 P4 P(S) P(T) P(S) 0 -1 0 0 -1 P(X) P(U) P(X) -1 P(U) -1 P(T) -23- Q Estado P1->Qs BLOQ P2->Qx P3->Qu P4->Qt BLOQ BLOQ BLOQ UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización 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 1 0 T 1 U 1 X 1 P1 P2 P3 P4 Q Estado P1->Qt P2->Qu P3->Qs P4->Qx BLOQ BLOQ BLOQ BLOQ P(S) 0 P(X) 0 P(U) 0 -1 P(T) P(T) -1 P(U) -1 P(S) -1 P(X) 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: P1 D(I) U(I) D(P) U(P) D(K) Instante P2 D(M) U(A) D(I) U(I) D(K) U(M) READY QUEUE I, B, A, C, P = 0 P3 U(B) D(C) D(G) U(G) M, K, G = 1 P4 D(A) D(A) U(I) D(K) U(K) D(P) U(P) RUN- P5 U(C) D(B) D(M) D(G) U(M) D(K) U(G) COLA DE SEM. SEMAFOROS NING I B A C P M K G 0 0 0 0 1 1 1 Inicial P1,P2,P3,P4,P5,P6 ______ 0 t1 P2,P3,P4,P5,P6 P1(DI) -1 T2 P3,P4,P5,P6 P2(DM) T3 P3,P4,P5,P6 P2(UA) T4 P3,P4,P5,P6 P2(DI) T5 P4,P5,P6 P3(UB) ____ I={P1} 0 1 _____ P1 = Blocked A={} -2 I={P1,P2} 1 P2 = Blocked B={} -1 C={P3} P4,P5,P6 P3(DC) T7 P5,P6 P4(DA) 0 A={} P4(DA) -1 A={P4} P5,P6 Estado M={} T6 T8 P6 D(K) U(A) D(I) U(I) D(M) U ( K) U(P) -24- P3 = Blocked P4 = Blocked UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas T9 P6 P5(UC) t10 P6, P3 P5(DB) t11 P6, P3 P5(DM) t12 P3 P6(DK) t13 P3 P6(UA) Guía nº 2 Sincronización 0 C={} 0 P3 = Ready B={} -1 M={P5} 0 P5 = Blocked K ={} 0 -3 A ={} P4 = Ready I={P1,P2,P6} P5 = Blocked t14 P3,P4 P6(DI) t15 P4 P3(DG) 0 G={} t16 P4 P3(UG) 1 G={} P3 = TERMINA t17 VACIA P4(UI) I={P2,P6} P1 = Ready t18 P1 P4(DK) K ={P4} P4 = Blocked t19 VACIA P1(UI) I={P6} P2 = Ready T20 P2 P1(DP) P={P1} P1 = Blocked T21 VACIA P2(UI) I={} P6 = Ready T22 P6 P2(DK) K ={P4,P2} P2 = Blocked T23 VACIA P6(UI) T24 VACIA P6(DM) -2 -1 -1 -1 0 -2 1 I={} -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 Do while (t) { traer_paquete() P(vacio) P(mutex) Cargar_paq_montacargas() V(mutex) V(lleno) } A Do while(t) { P(a) P(lleno) Retirar_paq_montacargas () V(mutex) V(vacio) Llevar_paquete_al_sector() -25- B 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 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 20 0 1 3 0 19 A D B Colas 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) 1 B Qb (Bloqueado) B Qb ( Ready) P(a) 3 P(lleno) 0 P(mutex) 1 V(mutex) 17 V(vacio) 0 V(b) 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 -26- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización 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 While (1) { wait(arqEnPos); wait(jugEnPos); darOrden(); signal (orden); wait(atajada) ; validar_tiro(); signal(ValidacionJ); signal(ValidacionJ); } Jugador While(1) { wait(turno[Actual()]); posicionarse(); signal(jugEnPos); wait(orden); patear(); signal(Tiro); wait(ValidacionJ) ; if(GOL=TRUE) festejar(); else lamentarse(); signal(turno[Siguiente()]) } Arquero 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 () Void Aerosilla() { while (1) { llegar_a_la_aerosilla(); wait(base) ; subir_a_la_aerosilla(); signal(silla); wait(cima); bajar_de_la_aerosilla(); signal(silla); { while(1) { wait(silla); subir_la_montaña(); signal(cima); wait(silla); bajar_la_montaña(); signal (base); } -27- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas bajar_esquiado(); } } Esquiador Llegar_a_la_aerosilla() W(base) Subir_a_la_aerosilla() S(silla) W(cima) Bajar_de_la_aerosilla S(silla) Bajar_esquiando() Guía nº 2 Sincronización } Aerosilla W(silla) Subir_a_la_montaña() S(cima) W(silla) Bajar_la_montaña() S(base) Silla 0 0 0 0 1 0 0 0 1 0 Cima 0 0 0 0 0 0 1 0 0 0 Base 1 1 0 0 0 0 0 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) 1)/NUMERO_DE_JUGADORES) ((IDENTIFICACION_DE_JUGADOR + 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 -28- UTN - FRBA Sistemas Operativos Lic. Graciela De Luca – Ing. Nicanor Casas Guía nº 2 Sincronización 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. P0 P1 P2 P3 Pensar() Wait(esperar[0]) Jugar() Signal(esperar[1]) Pensar() Wait(esperar[0]) Pensar() Wait(esperar[1]) Pensar() Wait(esperar[2]) Pensar() Wait(esperar[3]) Jugar() Signal(esperar[2]) Pensar() Wait(esperar[1]) Jugar() Signal(esperar[3]) Pensar() Wait(esperar[3]) -29- Jugar() Signal(esperar[3]) Pensar() Wait(esperar[3]) 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 Esperar 1 2 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0