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

De Cuba-Wiki
Línea 30: Línea 30:
a)
a)
<pre>
<pre>
count2 = 2  
Count5 = 2  
count = 3
Count6 = 1
 
s1  
s1  
fork L2
fork L3  
fork L3  
fork L4  
fork L4  
jump Sigo
L2:
s2  
s2  
jump Sigo2
jump Join5


L3:
L3:
s3  
s3
Sigo2:
jump Join5
join count2
 
jump Sigo
Join5:
join Count5
s5
jump Join6


L4:
L4:
s4  
s4
Sigo:
jump Join6
join count


Join6:
join Count6
</pre>
</pre>
b)
b)

Revisión del 18:37 8 nov 2006

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)

	Count5 = 2 
	Count6 = 1 

	s1 
	fork L3 
	fork L4 
	s2 
	jump Join5 

	L3:
	s3
	jump Join5 

	Join5:
	join Count5
	s5
	jump Join6

	L4:
	s4
	jump Join6

	Join6:
	join Count6

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:

NOTA 1: Preguntar ejercicios del 7 al 10... Tienen pinta de entrar seguro :)

NOTA 2: 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.

2) No deben hacerse suposiciones sobre la velocidad de los procesos.

3) Cuando un proceso no está en su región crítica no debe impedir que los demás ingresen a su región crítica.

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.

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 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.