Práctica Programación Concurrente (Sistemas Operativos)

De Cuba-Wiki

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.