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)
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)
c)
Ejercicio 06:
a)
b)
Ejercicio 07:
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.