Diferencia entre revisiones de «Práctica Programación Concurrente (Sistemas Operativos)»
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 | 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? --> 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: == | |||
== 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:(*) == | ||
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.