Práctica Programación Concurrente (Sistemas Operativos)

De Cuba-Wiki

Ejercicio 01:

/ Instrucciones Conj. Lectura Conj. Escritura
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) 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.