Práctica Programación Concurrente (Sistemas Operativos)
Ejercicio 01:
|
Condiciones de Bernstein: R(Si) n W(Sj) = W(Si) n R(Sj) = W(Si) n W(Sj) = {}
Se pueden ejecutar concurrentemente S1 y S2, S1 y S3, S1 y S5, S2 y S5
Ejercicio 02:[*]
a)
Count5 = Count6 = 2 s1 fork L3 fork L4 s2 jump Join5 L3: s3 jump Join5 Join5: join Count5 s5 jump Join6 L4: s4 jump Join6 Join6: join Count6
b)
s1 parbegin begin parbegin s2 s3 parend s5 end s4 parend s6
Ejercicio 03:[*]
La instruccion Join es indivisible porque debe ser atomica. Es decir, no puede ser interrumpida a la mitad. Esto es necesario ya que join mantiene una cuenta de cuantos procesos esta esperando, y si no fuera atomica, podria funcionar mal, y por ejemplo "matar" a todos los dos o mas procesos que tenian que unirse ahi.
Ejercicio 04:[*]
a) Me parece que es el tipo de grafos que no pueden ser representados con parbegin/parend. PREGUNTAR
b) PREGUNTAR ESTO TB
Ejercicio 05:
a) Agarramos el grafo de antes, sacamos la flecha de S5 a S6 y ponemos una flecha de S5 a S7, de S6 a S7 y de S4 a S7...
b)
c)
Count5 = Count7 = 2 s1 fork L3 fork L4 s2 jump Join5 L3: s3 jump Join5 L4: s4 s6 jump Join7 Join5: join Count5 jump Join7 Join7: join Count7
Ejercicio 06:
a) Si no lo hice mal, es una cosa mas o menos asi:
S1 ____________ / | \ S2 S3 S7 \ / / \ S4 S8 S9 / \ | | S5 S6 S10 | \ / \ / x x \_________/ S11
Ejercicio 07:
NOTA 1: Preguntar ejercicios del 7 al 10... Tienen pinta de entrar seguro :)
NOTA 2: PREMISAS DE DIJKSTRA:
1) No deben hacerse suposiciones sobre las instrucciones de máquina ni la cantidad de procesadores. Sin embargo, se supone que las instrucciones de máquina (Load, Store, Test) son ejecutadas atómicamente, o sea que si son ejecutadas simultáneamente el resultado es equivalente a su ejecución secuencial en un orden desconocido.
2) No deben hacerse suposiciones sobre la velocidad de los procesos.
3) Cuando un proceso no está en su región crítica no debe impedir que los demás ingresen a su región crítica.
4) La decisión de qué procesos entran a una parte crítica no puede ser pospuesta indefinidamente. Los puntos 3) y 4) evitan bloqueos mutuos.
5) Debe existir un límite al número de veces que otros procesos están habilitados a entrar a secciones críticas después que un proceso haya hecho su pedido.
Ejercicio 08:
Ejercicio 09:
Ejercicio 10:
Ejercicio 11:
a)
b)
Ejercicio 12:[*]
Porque como cambian el valor del semaforo y despues lo evalua, al haber concurrencia se pueden quedar en WAIT dos ejecuciones de P. Ver Test-And-Set
Ejercicio 13:
Si alguien llega al puente, y no hay nadie esperando de ninguno de los dos lados, se lo pone a cruzar. Si hay alguien cruzando o esperando, y alguien llega, esa persona espera. Cuando una persona termina de cruzar el puente, si hay alguien esperando del lado que llego, le dice che, ahora cruza vos. Y si no, mira para atras, y si del otro lado hay alguien esperando para cruzar le grita cheeeeeeeeeee cruza vooooooooosss.
Ejercicio 14:[*]
Monitor ej14 var: bandera : condicion procedure P(x) begin x = x-1 if (x<0) then Wait(bandera) endif end procedure V(x) begin x = x+1 if (x<=0) then Signal(Bandera) endif end
ver pag 19 al final
Ejercicio 15:[*]
a)
E = 1; S = 0 procedure Productor begin P(E) .... V(S) end procedure Consumidor begin P(S) .... V(E) end
b)
programa Productor_Consumidor; MAX = ......; monitor M; buffer : Array (0..MAX-1); in, out, n; enteros; buff_lleno, buff_vacío: condición; procedure Almacenar (v); begin if n = MAX then Wait (buff_vacío); buffer (in) = v; in = (in + 1) mod MAX; n = n + 1; Signal (buff_lleno) end; procedure Retirar (v); begin if n = 0 then Wait (buff_lleno); v = buffer (out); out = (out + 1) mod MAX; n = n - 1; Signal (buff_vacio) end; begin (* Cuerpo del monitor *) in, out, n = 0; end; (* fin monitor *) procedure Productor; begin v = "dato producido" Almacenar (v) end; procedure Consumidor; begin Retirar (v); Hacer algo con v end; begin Programa-Principal Begin; cobegin Productor; Consumidor coend end.
Ejercicio 16:[*]
[Diego Edit: esta mal. La idea es que cuando hay alguien escribiendo no puede haber nadie leyendo. Lo hicieron en clase a este programa [Multiples Lectores, un solo escritor]. ]
X = 1 procedure Leer begin //leo el archivo end procedure Escribir begin P(X) //escribo el archivo V(X) end begin Prog-Principal(operacion) if (operacion == "Leer") then Leer else Escribir endif end
Ejercicio 17:
Ejercicio 18:
a)
// en este esquema cualquiera de los dos puede entrar primero, si entra deshabilita al otro el acceso: x=1 Procedure Romanos Begin P(x) ..... V(x) End Procedure Egipcios Begin P(x) ..... V(x) End Do forever Parbegin Egipcio;Romanos End
b)
x=1 colaegipcios=0 w=1-colaegipcios Procedure Romanos Begin P(excl)//este semaforo no se si hace falta ay que analizarlo P(w) P(x) V(excl) ..... P(excl) V(x) V(w) P(excl) End Procedure Egipcios Begin P(excl) // en esta parte incremento la cola, que hace que w sea negativo y los romanos se queden esperando V(colaegipcios) P(x) P(excl) ....... P(excl) V(x) P(colaegipcios) P(excl) End Do forever Parbegin Egipcios Romanos End
c)
Ejercicio 19:[*]
Monitor PeruanosLocos var: HayCarretilla: Boolean CintaOcupada, CintaLibre : condition Procedure CargarCarretilla Begin If (HayCarretilla) then wait(CintaLibre) HayCarretilla = true Signal(CintaOcupada) End Procedure RetirarCarretilla Begin If (!HayCarretilla) then wait(CintaOcupada) HayCarretilla = false Signal(CintaLibre) End Begin Body HayCarretilla = false End End Monitor Procedure ObreroCargador Begin CargarCarretilla End Procedure ObreroRetirador Begin RetirarCarretilla End Begin Main Parbegin ObreroCargador ObreroRetirador Parend End
Ejercicio 20:
La b) ya que siempre uno llega primero y "espera" y el otro sigue de largo.
La c) tambien, por la misma razon.
Ejercicio 21:[*]
Ni idea que quieren
Ejercicio 22:[*]
Estoy harto de esos ejercicios que te meten enunciados al pedo!!
Ejercicio 23:[*]
Por que estamos diciendo que se puede ejecutar en paralelo:
a = b + c y
e = a / b + n * n
y no es lo mismo ejecutarlas en paralelo, que en forma secuencial ya que la 2nda instruccion tiene una dependencia de datos con la primera.