Edición de «Práctica Programación Concurrente (Sistemas Operativos)»

De Cuba-Wiki
Advertencia: no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si inicias sesión o creas una cuenta, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.

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:
{{Back|Sistemas Operativos}}
==Ejercicio 01:==
 
===Ejercicio 1===


{| class="wikitable" style="text-align:center"
{| class="wikitable" style="text-align:center"
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
<br>S1 y S2,  
<br>S1 y S3,  
<br>S1 y S5,  
<br>S2 y S3,
<br>S2 y S5


===Ejercicio 2*===
==Ejercicio 02:[*]==
a)
a)
<pre>
<pre>
    Count5 = Count6 = 2
Count5 = Count6 = 2
 
s1
fork L3
fork L4
s2
jump Join5
 
L3:
s3
jump Join5


    s1
Join5:
    fork L1
join Count5
    fork L2
s5
    s2
jump Join6
    goto L3
 
L2: s3
L4:
L3: join Count5
s4
    s5
jump Join6
    goto L4
 
L1: s4
Join6:
        L4: join Count6
join Count6
            S6
</pre>
</pre>
b)
b)
Línea 69: Línea 71:
</pre>
</pre>


===Ejercicio 3*===
==Ejercicio 03:[*]==
<br>La instrucción Join debe ser atómica ya que mantiene una cuenta de cuantos procesos esta esperando, y si no fuera atómica, podría funcionar mal, y por ejemplo "matar" a, los dos o mas procesos que tenían que unirse ahi.  
<br>La instruccion Join es indivisible porque debe ser atomica. Es decir, 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>
La definición de ''' join var''' es:
<br>
1 ) var - - ;
<br>
2 ) if (var =! 0) then wait;
<br>
si justo es interrumpida después de 1) y antes de 2) y para ejecutar otro join con la misma variable. supongamos que var valia 0, y ahora se decrementa y pasa a varler -1, chau
tu programa queda en wait para siempre.
 
<br>
<br>


===Ejercicio 4*===
==Ejercicio 04:[*]==
<br>a) Es el tipo de grafos que no pueden ser representados con parbegin/parend, ya que no se puede dividirlo en subgrafos disjuntos concurrentes.
<br>a) Es el tipo de grafos que no pueden ser representados con parbegin/parend, ya que no se puede dividirlo en subgrafos disjuntos concurrentes.
<br>b)  
<br>b)  
<pre>
<br>
var a,b,c,d,e,f,g,h: semaforo;
init(todos,0);


Parbegin
==Ejercicio 05:==
Begin S1;V(a);V(b);V(c); End
Begin P(a);S2;V(d);V(e); End
Begin P(b);S3;V(f); End
Begin P(c);S4;V(h); End
Begin P(d);P(f);S5;V(e); End
Begin P(g);P(h);S6:End
Parend
 
</pre>
 
===Ejercicio 5===
<br>a) Aca lo tienen:
<br>a) Aca lo tienen:
<pre>
<pre>
Línea 115: Línea 94:
</pre>
</pre>
<br>b) Se puede construir el grafo de manera "secuencial", es decir, S1-S2-S3-S5-S4-S6-S7 (Claramente no tiene el mayor grado de concurrencia posible).
<br>b) Se puede construir el grafo de manera "secuencial", es decir, S1-S2-S3-S5-S4-S6-S7 (Claramente no tiene el mayor grado de concurrencia posible).
O simplemente basta con borrar algun Parbegin con su Parend correspondiente y decir que las instrucciones que habia en medio se podrian haber ejecutado concurrentemente.
<br>c)
<br>c)
<pre>
<pre>
Count5 = Count7 = 2
Count5 = Count7 = 2


S1
s1
fork L3
fork L3
fork L4
fork L4
S2
s2
jump Join5
jump Join5


L3:
L3:
S3
s3
jump Join5
jump Join5


L4:
L4:
S4
s4
S6
s6
jump Join7
jump Join7


Join5:
Join5:
join Count5
join Count5
S5
jump Join7
        jump Join7


Join7:
Join7:
join Count7
join Count7
        S7
</pre>
</pre>


===Ejercicio 6===
==Ejercicio 06:==
a) Si no lo hice mal, es una cosa mas o menos asi:
a) Si no lo hice mal, es una cosa mas o menos asi:
<pre>
<pre>
Línea 192: Línea 168:
s11
s11
</pre>
</pre>
c) S1, S7, S8 (porque son los unicos de los que depende S10)
c)


===Ejercicio 7===
==Ejercicio 07:==


<pre>
<pre>
(NOTA PARA EJS 7-11)
(NOTA PARA EJS 7-11)
PREMISAS DE DIJKSTRA:
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.
1) No deben hacerse suposiciones sobre las instrucciones de máquina ni la cantidad de </br>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 </br>resultado es equivalente a su ejecución  secuencial en un orden desconocido.
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.
 
2) No deben hacerse suposiciones sobre la velocidad de los procesos.
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.
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</br> después que un proceso haya hecho su pedido.
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.
</pre>
</pre>


Similar al Alg. 2, no se asegura que un solo proceso este en la zona critica, ej:
==Ejercicio 08:==
<br> T0 Tarea1 encuentra C2 = 1,<br>  T1 Tarea2 encuentra C1 = 1,<br>  T2 Tarea2 pone C2 = 0,<br> T3 Tarea1 pone C1 = 0
<br>
 
==Ejercicio 09:==
===Ejercicio 8===
<br>
Similar al Alg. 3, no cumple 4) ya que ambos procesos pueden quedar en espera indefinida, ej:
==Ejercicio 10:==
<br> T0 Tarea1 encuentra C1 = 0,<br>  T1 Tarea2 encuentra C2 = 0
<br>
 
==Ejercicio 11:==
===Ejercicio 9===
Similar al Alg. 4, no cumple 4) ya que ambos procesos pueden quedar en espera indefinida (por el while)
 
===Ejercicio 10===
<br> No cumple 4), ya que si no hace el while suficientemente rapido siempre entra el proceso i en vez de j.
 
===Ejercicio 11===
Creo que podrian ser asi (cualquier cosa corrijan):
<br>a)
<br>a)
<pre>
<br>b)
Procedure Pi
Do
key = T;
while(key)
Swap(lock, key);
seccion critica
lock = F;
seccion no critica
End
 
Begin Main
lock = F;
Parbegin
P0;P1;...;Pn
Parend
End
</pre>
<br>
<br>
<br>b)
==Ejercicio 12:[*]==
<pre>
Procedure Pi
Do
while(TestAndSet(lock));
seccion critica
lock = F;
seccion no critica
End
 
Begin Main
lock = F;
Parbegin
P0;P1;...;Pn
Parend
End
</pre>
 
===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===
==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> Solucion de Andy:
<br>
<pre>
==Ejercicio 14:[*]==
x=1, y=0, gentelado1=gentelado2=0
 
Proc CruzarLado1
P(exc)
P(X)
gentelado1++
V(exc)
cruzar
P(exc)
gentelado1--
if (gentelado2>0 || gentelado1==0)
V(Y)
else
V(X)
endif
V(exc)
 
Proc CruzarLado2
P(exc)
P(Y)
gentelado2++
V(exc)
cruzar
P(exc)
gentelado2--
if (gentelado1>0 || gentelado2==0)
V(X)
else
V(Y)
endif
V(exc)
</pre>
 
===Ejercicio 14*===
<pre>
<pre>
Monitor ej14  
Monitor ej14  
Línea 329: Línea 228:
(Ver pag 19 al final)
(Ver pag 19 al final)


===Ejercicio 15*===
==Ejercicio 15:[*]==
a)
a)
<pre>
<pre>
Línea 402: Línea 301:
</pre>
</pre>


===Ejercicio 16*===
==Ejercicio 16:[*]==
La idea es que cuando hay alguien escribiendo no puede haber nadie leyendo. (Multiples Lectores, un solo escritor)
La idea es que cuando hay alguien escribiendo no puede haber nadie leyendo. (Multiples Lectores, un solo escritor)
<pre>
<pre>
Línea 415: Línea 314:
//leo el archivo  
//leo el archivo  
P(X)
P(X)
CantLectores--
if (CantLectores == 0) then V(Escr)
if (CantLectores == 0) then V(Escr)
V(X)
V(X)
Línea 437: Línea 335:
</pre>
</pre>


===Ejercicio 17===
==Ejercicio 17:==
<br> (Hay que darle prioridad a un solo lado del puente)
<br> (Hay que darle prioridad a un solo lado del puente)
<pre>
x = 1, sentido = izq, autosizq  = ?, autosder = ?
Proc Cruzar
if (sentido == izq)
if (autosizq > 0)
P(x)
cruzar
V(x)
P(exc)
if (--autosizq == 0)
sentido = der
V(exc)
else
sentido = der
actualiza(autos)
endif
elseif (sentido == der)
if (autosder > 0)
P(x)
cruzar
V(x)
P(exc)
if (--autosder == 0)
sentido = izq
V(exc)
else
sentido = izq
actualiza(autos)
endif
endif
</pre>


===Ejercicio 18===
==Ejercicio 18:==
a)
a)
<pre>
<pre>
Línea 501: Línea 368:
Procedure Romanos
Procedure Romanos
Begin
Begin
P(excl)//este semaforo no se si hace falta, hay que analizarlo
P(excl)//este semaforo no se si hace falta ay que analizarlo
P(w)
P(w)
P(x)
P(x)
Línea 554: Línea 421:
c)
c)


===Ejercicio 19*===
==Ejercicio 19:[*]==
<pre>
<pre>
Monitor PeruanosLocos
Monitor PeruanosLocos
Línea 601: Línea 468:
</pre>
</pre>


===Ejercicio 20===
==Ejercicio 20:==
<br>La b) ya que siempre uno llega primero y "espera" y el otro sigue de largo.
<br>La b) ya que siempre uno llega primero y "espera" y el otro sigue de largo.
<br>La c) tambien, por la misma razon.
<br>La c) tambien, por la misma razon.


===Ejercicio 21*===
==Ejercicio 21:[*]==
<pre>
<pre>
Monitor Lectores-Escritores
Monitor Lectores-Escritores
Línea 656: Línea 523:
</pre>
</pre>


===Ejercicio 22*===
==Ejercicio 22:[*]==
<pre>
<br>(Tendria que salir con Lectores-Escritores)
Monitor SuperTormino
<br>


Var: ocupado :boolean;
==Ejercicio 23:[*]==
no_ocupado :condition;
 
Procedure Cliente
Begin
if ocupado then wait(no_ocupado);
ocupado = V;
End
 
Procedure Balanza
Begin
ocupado = F;
pesar
signal(no_ocupado);
End
 
Begin Monitor
ocupado = F;
End
</pre>
 
===Ejercicio 23*===
<br>Porque estamos diciendo que se puede ejecutar en paralelo:
<br>Porque estamos diciendo que se puede ejecutar en paralelo:
<br>a = b + c  y
<br>a = b + c  y
Línea 687: Línea 533:
<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>
[[Category:Prácticas]]
Ten en cuenta que todas las contribuciones a Cuba-Wiki pueden ser editadas, modificadas o eliminadas por otros colaboradores. Si no deseas que las modifiquen sin limitaciones, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre (véase Cuba-Wiki:Derechos de autor para más detalles). ¡No uses textos con copyright sin permiso!

Para editar esta página, responde la pregunta que aparece abajo (más información):

Cancelar Ayuda de edición (se abre en una ventana nueva)

Plantilla usada en esta página: