Práctica Programación Concurrente (Sistemas Operativos)
Ejercicio 01:
S1 a = b+c R(S1) = {b,c} W(S1) = {a}
S2 d = b+e R(S2) = {b,e} W(S2) = {d}
S3 f = c+e R(S3) = {c,e} W(S3) = {f}
S4 g = fun1(a,d,f) R(S4) = {a,d,f} W(S4) = {g}
S5 f = sen(w) R(S5) = {w} W(S5 = {f}
Condiciones de Bernstein: R(Si) ∩ W(Sj) = W(Si) ∩ R(Sj) = W(Si) ∩ W(Sj) = {}
Se pueden ejecutar concurrentemente S1 y S2 y S3, S1 y S5, S2 y S5
Ejercicio 02:(*)
a. count2 = 2
count = 3
s1
fork L2
fork L3
fork L4
jump Sigo
L2:
s2
jump Sigo2
L3:
s3
Sigo2:
join count2
jump Sigo
L4:
s4
Sigo:
join count
b.
s1
parbegin
begin
parbegin
s2
s3
parend
s5
end
s4
parend
s6
Ejercicio 03:(*)
Que es indivisible? --> Indivisible es que es atomica. Que 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.
Ejercicio 06:
Nota Ejercicios 07 al 10:
NOTA: Ejercicios del 7 al 10. Preguntar estos... Tienen pinta de entrar seguro :)
Ejercicio 07:
Ejercicio 08:
Ejercicio 09:
Ejercicio 10:
Ejercicio 11:
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 Set-And-Test
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
Ejercicio 15:(*)
a.
E = 1; S = 0
procedure Productor
begin
P(E)
....
V(S)
end
procedure Consumidor
begin
P(S)
....
V(E)
end
b.
Esta el mismo ejercicio en la pagina 19 del capitulo 19.
Ejercicio 16:(*)
[Diego Edit: Esto 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:
Ejercicio 19:(*)
Muy largo como para leerlo
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.