Diferencia entre revisiones de «Práctica Programación Concurrente (Sistemas Operativos)»

De Cuba-Wiki
Sin resumen de edición
Sin resumen de edición
Línea 13: Línea 13:
Condiciones de Bernstein: R(Si) ∩ W(Sj) = W(Si) ∩ R(Sj) = W(Si) ∩ W(Sj) = {}
Condiciones de Bernstein: R(Si) ∩ W(Sj) = W(Si) ∩ R(Sj) = W(Si) ∩ W(Sj) = {}


Se pueden ejecutar concurrentemente S1 y S2, S1 y S3, S1 y S5, S2 y S3, S2 y S5
Se pueden ejecutar concurrentemente S1 y S2 y S3, S1 y S5, S2 y S5


== Ejercicio 02:(*) ==  
== Ejercicio 02:(*) ==  
Línea 88: Línea 88:
== Ejercicio 03:(*) ==  
== Ejercicio 03:(*) ==  


Que es indivisible?
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:(*) ==  
== Ejercicio 04:(*) ==  


a. Me parece que es el tipo de grafos que no pueden ser representados con parbegin/parend. PREGUNTAR
a. Me parece que es el tipo de grafos que no pueden ser representados con parbegin/parend. PREGUNTAR
 
b. PREGUNTAR ESTO TB
 


== Ejercicio 05: ==
== 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: ==


== Ejercicio 06: ==




== Nota Ejercicios 07 al 10: ==
NOTA: Ejercicios del 7 al 10. Preguntar estos... Tienen pinta de entrar seguro :)


== Ejercicio 07: ==
== Ejercicio 07: ==




Línea 132: Línea 132:
Porque como cambian el valor del semaforo y despues lo evalua, al haber concurrencia se pueden quedar en  
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
WAIT dos ejecuciones de P. Ver Set-And-Test


== Ejercicio 13: ==
== 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:(*) ==
== Ejercicio 14:(*) ==
Línea 227: Línea 223:
== Ejercicio 16:(*) ==
== 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
X = 1


Línea 270: Línea 267:


== Ejercicio 17: ==
== Ejercicio 17: ==


== Ejercicio 18: ==
== Ejercicio 18: ==
Línea 284: Línea 279:


== Ejercicio 20: ==
== 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.




Línea 301: Línea 298:
== Ejercicio 23:(*) ==
== Ejercicio 23:(*) ==


Roberto hablo de unas reglas en clase... pero no las encuentro
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.

Revisión del 05:15 31 oct 2006

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.