Edición de «Práctica Programación Concurrente (Sistemas Operativos)»
De Cuba-Wiki
Puedes deshacer la edición. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces publica los cambios para así efectuar la reversión.
Revisión actual | Tu texto | ||
Línea 1: | Línea 1: | ||
==Ejercicio 01:== | |||
{| class="wikitable" style="text-align:center" | {| class="wikitable" style="text-align:center" | ||
Línea 20: | Línea 18: | ||
|g = fun1[a,d,f]||R(S4) = {a,d,f}||W(S4) = {g} | |g = fun1[a,d,f]||R(S4) = {a,d,f}||W(S4) = {g} | ||
|- | |- | ||
! | ! 5 | ||
|f = sen[w]||R(S5) = {w}||W(S5) = {f} | |f = sen[w]||R(S5) = {w}||W(S5) = {f} | ||
|- | |- | ||
Línea 27: | Línea 25: | ||
<br>Condiciones de Bernstein: R(Si) n W(Sj) = W(Si) n R(Sj) = W(Si) n W(Sj) = {} | <br>Condiciones de Bernstein: R(Si) n W(Sj) = W(Si) n R(Sj) = W(Si) n W(Sj) = {} | ||
<br>Se pueden ejecutar concurrentemente | <br>Se pueden ejecutar concurrentemente S1 y S2, S1 y S3, S1 y S5, S2 y S5 | ||
==Ejercicio 02:[*]== | |||
a) | <br>a) | ||
< | <br> count2 = 2 | ||
<br> count = 3 | |||
<br> s1 | |||
<br> fork L2 | |||
<br> fork L3 | |||
<br> fork L4 | |||
<br> jump Sigo | |||
<br> L2: | |||
<br> s2 | |||
<br> jump Sigo2 | |||
<br> L3: | |||
<br> s3 | |||
<br> Sigo2: | |||
<br> join count2 | |||
<br> jump Sigo | |||
<br> L4: | |||
<br> s4 | |||
<br> Sigo: | |||
<br> join count | |||
<br> | |||
<br>b) | |||
<br> s1 | |||
<br> parbegin | |||
<br> begin | |||
<br> parbegin | |||
<br> s2 | |||
<br> s3 | |||
<br> parend | |||
<br> s5 | |||
<br> end | |||
<br> s4 | |||
<br> parend | |||
<br> s6 | |||
<br> | |||
==Ejercicio 03:[*]== | |||
<br>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. | |||
<br> | |||
<br> | <br> | ||
==Ejercicio 04:[*]== | |||
<br>a) Me parece que es el tipo de grafos que no pueden ser representados con parbegin/parend. PREGUNTAR | |||
<br>b) PREGUNTAR ESTO TB | |||
<br> | <br> | ||
==Ejercicio 05:== | |||
<br>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... | |||
<br>b) | |||
<br>c) | |||
<br> | <br> | ||
==Ejercicio 06:== | |||
<br>a) | |||
<br>b) | |||
<br> | <br> | ||
<br>NOTA: Ejercicios del 7 al 10. Preguntar estos... Tienen pinta de entrar seguro :) | |||
<br> | <br> | ||
== | ==(NOTA: PREMISAS DE DIJKSTRA:)== | ||
1) No deben hacerse suposiciones sobre las instrucciones de máquina ni la cantidad de procesadores. Sin embargo, se supone que las instrucciones de máquina (Load, Store, Test) son ejecutadas atómicamente, o sea que si son ejecutadas simultáneamente el resultado es equivalente a su ejecución secuencial en un orden desconocido. | |||
1) No deben hacerse suposiciones sobre las instrucciones de máquina ni la cantidad de | |||
2) No deben hacerse suposiciones sobre la velocidad de los procesos. | 2) No deben hacerse suposiciones sobre la velocidad de los procesos. | ||
Línea 208: | Línea 94: | ||
4) La decisión de qué procesos entran a una parte crítica no puede ser pospuesta indefinidamente. | 4) La decisión de qué procesos entran a una parte crítica no puede ser pospuesta indefinidamente. | ||
Los puntos 3) y 4) evitan bloqueos mutuos. | Los puntos 3) y 4) evitan bloqueos mutuos. | ||
5)- Debe existir un límite al número de veces que otros procesos están habilitados a entrar a secciones críticas | |||
después que un proceso haya hecho su pedido. | |||
==Ejercicio 07:== | |||
<br> | |||
<br> | |||
===Ejercicio | ==Ejercicio 08:== | ||
<br> | |||
==Ejercicio 09:== | |||
<br> | |||
<br> | ==Ejercicio 10:== | ||
<br> | |||
==Ejercicio 11:== | |||
<br>a) | <br>a) | ||
< | <br>b) | ||
<br> | <br> | ||
==Ejercicio 12:[*]== | |||
<br>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 | <br>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 | ||
<br> | <br> | ||
==Ejercicio 13:== | |||
<br>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. | <br>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. | ||
<br> | <br> | ||
< | ==Ejercicio 14:[*]== | ||
x=1, | <br> Monitor ej14 | ||
<br> var: bandera : condicion | |||
<br> | |||
<br> procedure P(x) | |||
<br> begin | |||
<br> x = x-1 | |||
<br> if (x<0) then | |||
<br> Wait(bandera) | |||
<br> endif | |||
<br> end | |||
<br> | |||
<br> procedure V(x) | |||
<br> begin | |||
<br> x = x+1 | |||
<br> if (x<=0) then | |||
<br> Signal(Bandera) | |||
<br> endif | |||
<br> end | |||
<br> | |||
<br>ver pag 19 al final | |||
<br> | |||
==Ejercicio 15:[*]== | |||
<br>a) | |||
<br> E = 1; S = 0 | |||
<br> | |||
<br> procedure Productor | |||
<br> begin | |||
<br> P(E) | |||
<br> .... | |||
<br> V(S) | |||
<br> end | |||
<br> | |||
<br> procedure Consumidor | |||
<br> begin | |||
<br> P(S) | |||
<br> .... | |||
<br> V(E) | |||
<br> end | |||
<br> | |||
<br>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.<br> | |||
==Ejercicio 16:[*]== | |||
<br>[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]. ] | |||
<br> | |||
<br> X = 1 | |||
<br> | |||
<br> procedure Leer | |||
<br> begin | |||
<br> //leo el archivo | |||
<br> end | |||
<br> | |||
<br> procedure Escribir | |||
<br> begin | |||
<br> P(X) | |||
<br> //escribo el archivo | |||
<br> V(X) | |||
<br> end | |||
<br> | |||
<br> begin Prog-Principal(operacion) | |||
<br> if (operacion == "Leer") then | |||
<br> Leer | |||
<br> else | |||
<br> Escribir | |||
<br> endif | |||
<br> end | |||
<br> | |||
==Ejercicio 17:== | |||
<br> | |||
==Ejercicio 18:== | |||
<br>a) | |||
<br> // en este esquema cualquiera de los dos puede entrar primero, si entra deshabilita al otro el acceso: | |||
<br> x=1 | |||
<br> Procedure Romanos | |||
<br> Begin | |||
<br> P(x) | |||
<br> ..... | |||
<br> V(x) | |||
<br> End | |||
<br> Procedure Egipcios | |||
<br> Begin | |||
<br> P(x) | |||
<br> ..... | |||
<br> V(x) | |||
<br> End | |||
<br> Do forever | |||
<br> Parbegin | |||
<br> Egipcio;Romanos | |||
<br> End | |||
<br> | |||
<br>b) | |||
<br> x=1 | |||
<br> colaegipcios=0 | |||
<br> w=1-colaegipcios | |||
<br> Procedure Romanos | |||
<br> Begin | |||
<br> P(excl)//este semaforo no se si hace falta ay que analizarlo | |||
<br> P(w) | |||
<br> P(x) | |||
< | <br> V(excl) | ||
<br> ..... | |||
<br> P(excl) | |||
<br> V(x) | |||
<br> V(w) | |||
<br> P(excl) | |||
<br> | |||
<br> End | |||
<br> Procedure Egipcios | |||
<br> Begin | |||
<br> P(excl) | |||
<br> // en esta parte incremento la cola, que hace que w sea negativo y los romanos se queden esperando | |||
<br> V(colaegipcios) | |||
<br> P(x) | |||
<br> P(excl) | |||
<br> ....... | |||
<br> P(excl) | |||
<br> V(x) | |||
<br> P(colaegipcios) | |||
<br> P(excl) | |||
<br> | |||
<br> End | |||
<br> Do forever | |||
<br> Parbegin | |||
<br> Egipcios | |||
<br> Romanos | |||
<br> End | |||
<br>c) | |||
<br> | |||
==Ejercicio 19:[*]== | |||
<br> Monitor PeruanosLocos | |||
<br> var: HayCarretilla: Boolean | |||
<br> CintaOcupada, CintaLibre : condition | |||
<br> | |||
<br> Procedure CargarCarretilla | |||
<br> Begin | |||
<br> If (HayCarretilla) then | |||
<br> wait(CintaLibre) | |||
<br> HayCarretilla = true | |||
<br> Signal(CintaOcupada) | |||
<br> End | |||
<br> | |||
<br> Procedure RetirarCarretilla | |||
<br> Begin | |||
<br> If (!HayCarretilla) then | |||
<br> wait(CintaOcupada) | |||
<br> HayCarretilla = false | |||
<br> Signal(CintaLibre) | |||
<br> End | |||
<br> | |||
<br> Begin Body | |||
<br> HayCarretilla = false | |||
<br> End | |||
<br> | |||
<br> End Monitor | |||
<br> | |||
<br> Procedure ObreroCargador | |||
<br> Begin | |||
<br> CargarCarretilla | |||
<br> End | |||
<br> | |||
<br> Procedure ObreroRetirador | |||
<br> Begin | |||
<br> RetirarCarretilla | |||
<br> End | |||
<br> | |||
<br> Begin Main | |||
<br> Parbegin | |||
<br> ObreroCargador | |||
<br> ObreroRetirador | |||
<br> Parend | |||
<br> End | |||
La idea es que cuando hay alguien escribiendo no puede haber nadie leyendo. | <br> | ||
< | ==Ejercicio 20:== | ||
<br>La b). Ya que siempre uno llega primero y "espera" y el otro sigue de largo. La c tambien. Por la misma razon. | |||
<br> | |||
==Ejercicio 21:[*]== | |||
<br>Ni idea que quieren | |||
<br> | |||
==Ejercicio 22:[*]== | |||
<br>Estoy harto de esos ejercicios que te meten enunciados al pedo== == | |||
<br> | |||
==Ejercicio 23:[*]== | |||
<br>Por que estamos diciendo que se puede ejecutar en paralelo: | |||
< | |||
<br> | |||
< | |||
endif | |||
< | |||
a) | |||
< | |||
< | |||
b) | |||
< | |||
< | |||
< | |||
< | |||
< | |||
< | |||
<br>La b) | |||
< | |||
< | |||
< | |||
<br> | |||
<br>a = b + c y | <br>a = b + c y | ||
<br>e = a / b + n * n | <br>e = a / b + n * n | ||
<br>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. | <br>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. | ||
<br> | <br> | ||