Diferencia entre revisiones de «Práctica Abrazo Mortal (Sistemas Operativos)»

De Cuba-Wiki
(Cambié el formato para hacerlo un poco más legible y 'printer friendly')
Línea 1: Línea 1:
==Ejercicio 01:==
===Ejercicio 1===
<br>Solamente si el mismo tiene varios hilos.  
Solamente si el mismo tiene varios hilos.  
<br>
 
==Ejercicio 02:[*]==
===Ejercicio 2*===
<br>Si. Pero la administracion de procesador/memoria solucionan estos problemas. (Al hacerlos recursos compartibles entre varios procesos).  
. Pero la administracion de procesador/memoria solucionan estos problemas. (Al hacerlos recursos compartibles entre varios procesos).  
<br>
 
==Ejercicio 03:==
===Ejercicio 3===
<br>¿Como se demuestra esto? La idea informal es: Si hay un solo proceso, lo ejecuto y como hay 4 y usa 2 anda todo bien. Si hay n, supongo "inductivamente" que para n - 1 no hay deadlock. Si hay algun proceso que tiene 2, ese tiene todo lo que necesita y puede terminar. Si no, como maximo son 3 procesos, cada uno tiene maximo 1, entonces sobra uno y todos tienen uno, entonces se lo doy a alguno y ese termina, o sobran 2 o mas, y se los doy a uno ese termina y recursivamente con n-1 no hay deadlock.  
La idea informal es: Si hay un solo proceso, lo ejecuto y como hay 4 y usa 2 anda todo bien. Si hay n, supongo "inductivamente" que para n - 1 no hay deadlock. Si hay algun proceso que tiene 2, ese tiene todo lo que necesita y puede terminar. Si no, como maximo son 3 procesos, cada uno tiene maximo 1, entonces sobra uno y todos tienen uno, entonces se lo doy a alguno y ese termina, o sobran 2 o mas, y se los doy a uno ese termina y recursivamente con n-1 no hay deadlock.  
<br>
 
==Ejercicio 04:[*]==
===Ejercicio 4*===
<br>Deadlock es que un proceso espera un evento que nunca va a ocurrir. En tiempo infinito los procesos del deadlock van a seguir blockeados... Inhanicion es que no recive, o recive poco procesador un proceso. En tiempo infinito, el proceso terminaria ejecutandose completamente.  
Deadlock es que un proceso espera un evento que nunca va a ocurrir. En tiempo infinito los procesos del deadlock van a seguir blockeados... Inhanicion es que no recive, o recive poco procesador un proceso. En tiempo infinito, el proceso terminaria ejecutandose completamente.  
<br>
 
==Ejercicio 05:[*]==
===Ejercicio 5*===
<br>Una dificultad de hacer roll-back es que se deshacen todos los acciones anteriores recorriendo el "log", y esto puede hacer que se deshagan los cambios de otros procesos. Otra dificultad es que hay operaciones que no se pueden deshacer (Ej: imprimir algo). Ademas es caro mantener informacion para poder hacer un roll back. Las ventajas es que si todo sale bien, el sistema sigue funcionando y no se perdio informacion.  
Una dificultad de hacer roll-back es que se deshacen todos los acciones anteriores recorriendo el "log", y esto puede hacer que se deshagan los cambios de otros procesos. Otra dificultad es que hay operaciones que no se pueden deshacer (Ej: imprimir algo). Ademas es caro mantener informacion para poder hacer un roll back. Las ventajas es que si todo sale bien, el sistema sigue funcionando y no se perdio informacion.  
<br>
 
==Ejercicio 06:==
===Ejercicio 6===
<br>a) se puede.
a. se puede.
<br>b) no se puede.
 
<br>c) no se puede.
b. no se puede.
<br>d) se puede.
 
<br>e) se puede.
c. no se puede.
<br>f) se puede.  
 
<br>
d. se puede.
==Ejercicio 07:[*]==
 
<br>a)
e. se puede.
<br>||Max ||Asignacion ||Necesidad ||
 
<br>||0 0 1 2 ||0 0 1 2 ||0 0 0 0 ||
f. se puede.  
<br>||1 7 5 0 ||1 0 0 0 ||0 7 5 0 ||
 
<br>||2 3 5 6 ||1 3 5 4 ||1 0 0 2 ||
===Ejercicio 7*===
<br>||0 6 5 2 ||0 6 3 2 ||0 0 2 0 ||
a.
<br>||0 6 5 6 ||0 0 1 4 ||0 6 4 2 ||
{| class="wikitable" style="text-align:center"
<br>b)
|
<br>||Finish || Work || P[i] tq Finish[i] = F y Nec[i] <= Work ||
{| border="1"
<br>||F F F F F || 1 5 2 0 || P[1] cumple -> Work += Asig[1] ||
|+'''MAX'''
<br>||T F F F F || 1 5 3 2 || P[3] cumple -> Work += Asig[3] ||
!Proceso !!R1 !!R2 !!R3 !!R4
<br>||T F T F F || 2 8 8 6 || P[2] cumple -> Work += Asig[2] ||
|-
<br>||T T T F F || 3 8 8 6 || P[4] cumple -> Work += Asig[4] ||
! P1
<br>||T T T T F || 3 14 11 8 || P[5] cumple -> Work += Asig[5] ||
|0||0||1||2
<br>||T T T T T || 3 14 12 12 || LISTO ||
|-
<br>Rta - Si.
! P2
<br>Secuencia segura: P(1); P(3); P(2); P(4); P(5);
|1||7||5||0
<br>c)
|-
<br>Corriendo el algoritmo del banquero:
! P3
<br>Req[2] <= Nec[2]? (0 4 2 0) <= (0 7 5 0) si
|2||3||5||6
<br>Req[2] <= Disp? (0 4 2 0) <= (1 5 2 0) si
|-
<br>Entonces se cambian:
! P4
<br>Disp - = Req[2] -> Disp = (1 1 0 0)
|0||6||5||2
<br>Asig[2] + = Req[2] -> Asig[2] = (1 4 2 0)
|-
<br>Nec[2] - = Req[2] -> Nec[2] = (0 3 3 0)
! P5
<br>
|0||6||5||6
<br>Corriendo el algoritmo de seguridad:
|}
<br>||Finish || Work || P[i] tq Finish[i] = F y Nec[i] <= Work ||
|
<br>||F F F F F || 1 1 0 0 || P[1] cumple -> Work += Asig[1] ||
'''-'''
<br>||T F F F F || 1 1 1 2 || P[3] cumple -> Work += Asig[3] ||
|
<br>||T F T F F || 2 4 6 6 || P[4] cumple -> Work += Asig[4] ||
{| border="1"
<br>||T F T T F || 2 10 8 8 || P[2] cumple -> Work += Asig[2] ||
|+'''ASIGNACIÓN'''
<br>||T T T T F || 3 14 10 8 || P[5] cumple -> Work += Asig[5] ||
!Proceso !!R1 !!R2 !!R3 !!R4
<br>||T T T T T || 3 14 11 12 || LISTO ||
|-
<br>Rta - Si.
! P1
<br>
|0||0||1||2
==Ejercicio 08:==
|-
<br>Si. Luego ejecuto P(1); P(3); P(2);
! P2
<br>
|1||0||0||0
==Ejercicio 09:[*]==
|-
<br>Tengo dos procesos que tienen MAX 10 y cada uno tiene 6. En esta sesion uno de los procesos con sus 6 llega a terminar, los libera, y el otro puede terminar tranquilamente.
! P3
<br>
|1||3||5||4
==Ejercicio 10:[*]==
|-
<br>||Max ||Asignacion ||Necesidad ||
! P4
<br>||3 1 1 3 ||2 0 0 2 ||1 1 1 1 ||
|0||6||3||2
<br>||3 2 3 4 ||0 1 1 0 ||3 1 2 4 ||
|-
<br>||3 3 2 2 ||0 1 0 1 ||3 2 2 1 ||
! P5
<br>a)
|0||0||1||4
<br>Corriendo el algoritmo del banquero:
|}
<br>Req[1] <= Nec[1]? (0 1 1 1) <= (1 1 1 1) si
|
<br>Req[1] <= Disp? (0 1 1 1) <= (1 3 3 1) si
'''='''
<br>Entonces se cambian:
|
<br>Disp - = Req[1] -> Disp = (1 2 2 0)
{| border="1"
<br>Asig[1] + = Req[1] -> Asig[1] = (2 1 1 3)
|+'''NECESIDAD'''
<br>Nec[1] - = Req[1] -> Nec[1] = (1 0 0 0)
!Proceso !!R1 !!R2 !!R3 !!R4
<br>
|-
<br>Corriendo el algoritmo de seguridad:
! P1
<br>||Finish|| Work || P[i] tq Finish[i] = F y Nec[i] <= Work ||
|0||0||0||0
<br>||F F F || 1 3 3 1 || P[1] cumple -> Work += Asig[1] ||
|-
<br>||T F F || 3 4 4 4 || P[2] cumple -> Work += Asig[2] ||
! P2
<br>||T T F || 3 4 5 4 || P[3] cumple -> Work += Asig[3] ||
|0||7||5||0
<br>||T T T || 3 5 5 5 || LISTO ||
|-
<br>Rta - Si.
! P3
<br>
|1||0||0||2
<br>b)
|-
<br>Corriendo el algoritmo del banquero:
! P4
<br>Req[2] <= Nec[2]? (1 0 0 1) <= (3 1 2 4) si
|0||0||2||0
<br>Req[2] <= Disp? (1 0 0 1) <= (1 3 3 1) si
|-
<br>Entonces se cambian:
! P5
<br>Disp - = Req[2] -> Disp = (0 3 3 0)
|0||6||4||2
<br>Asig[2] + = Req[2] -> Asig[2] = (1 1 1 1)
|}
<br>Nec[2] - = Req[2] -> Nec[2] = (2 1 2 3)
|}
<br>
 
<br>Corriendo el algoritmo de seguridad:
b.
<br>||Finish|| Work || P[i] tq Finish[i] = F y Nec[i] <= Work ||
{| class="wikitable" style="text-align:center"
<br>||F F F || 0 3 3 0 || NO HAY ||
|
<br>Rta - No.
{| border="1"
<br>
|+ '''AB'''
!PASO
|-
|0
|-
|1
|-
|2
|-
|3
|-
|4
|-
|5
|}
||
{| border="1"
|+'''FINISH'''
!P1 !!P2 !!P3 !!P4 !!P5
|-
|F||F||F||F||F
|-
|T||F||F||F||F
|-
|T||F||T||F||F
|-
|T||T||T||F||F
|-
|T||T||T||T||F
|-
|T||T||T||T||T
|}
||
{| border="1"
|+'''WORK'''
!R1 !!R2 !!R3 !!R4
|-
|1||5||2||0
|-
|1||5||3||2
|-
|2||8||8||6
|-
|3||8||8||6
|-
|3||14||11||8
|-
|3||14||12||12
|}
||
{| border="1"
|+'''ENTONCES'''
!Puedo Seguir?
|-
|P1 cumple -> Work += Asig[1]
|-
|P3 cumple -> Work += Asig[3]
|-
|P2 cumple -> Work += Asig[2]
|-
|P4 cumple -> Work += Asig[4]
|-
|P5 cumple -> Work += Asig[5]
|-
|'''SUCCESS'''
|}
|}
 
Por lo tanto, el sistema está en estado seguro. La secuencia segura es '''P1 - P3 - P2 - P4 - P5'''
 
c.
Corriendo el algoritmo del banquero:
*Req[2] <math>\le</math> Nec[2]? (0 4 2 0) <math>\le</math> (0 7 5 0)
*Req[2] <math>\le</math> Disp? (0 4 2 0) <math>\le</math> (1 5 2 0)
 
Entonces se cambian:
*Disp -= Req[2] <math>\to</math> Disp = (1 1 0 0)
*Asig[2] += Req[2] <math>\to</math> Asig[2] = (1 4 2 0)
*Nec[2] -= Req[2] <math>\to</math> Nec[2] = (0 3 3 0)
 
Corriendo el algoritmo de Seguridad:
{| class="wikitable" style="text-align:center"
|
{| border="1"
|+ '''AB'''
!PASO
|-
|0
|-
|1
|-
|2
|-
|3
|-
|4
|-
|5
|}
||
{| border="1"
|+'''FINISH'''
!P1 !!P2 !!P3 !!P4 !!P5
|-
|F||F||F||F||F
|-
|T||F||F||F||F
|-
|T||F||T||F||F
|-
|T||F||T||T||F
|-
|T||T||T||T||F
|-
|T||T||T||T||T
|}
||
{| border="1"
|+'''WORK'''
!R1 !!R2 !!R3 !!R4
|-
|1||1||0||0
|-
|1||1||1||2
|-
|2||4||6||6
|-
|2||10||8||8
|-
|3||14||10||8
|-
|3||14||11||12
|}
||
{| border="1"
|+'''ENTONCES'''
!Puedo Seguir?
|-
|P1 cumple -> Work += Asig[1]
|-
|P3 cumple -> Work += Asig[3]
|-
|P4 cumple -> Work += Asig[4]
|-
|P2 cumple -> Work += Asig[2]
|-
|P5 cumple -> Work += Asig[5]
|-
|'''SUCCESS'''
|}
|}
 
Por lo tanto, el pedido puede ser satisfecho.
 
===Ejercicio 8===
Sí. Luego ejecuto '''P1 - P3 - P2'''.
 
===Ejercicio 9*===
Tengo dos procesos que tienen MAX 10 y cada uno tiene 6. En esta sesion uno de los procesos con sus 6 llega a terminar, los libera, y el otro puede terminar tranquilamente.
 
===Ejercicio 10*===
{| class="wikitable" style="text-align:center"
|
{| border="1"
|+'''MAX'''
!Proceso !!R1 !!R2 !!R3 !!R4
|-
! P1
|3||1||1||3
|-
! P2
|3||2||3||4
|-
! P3
|3||3||2||2
|}
|
{| border="1"
|+'''ASIGNACIÓN'''
!Proceso !!R1 !!R2 !!R3 !!R4
|-
! P1
|2||0||0||2
|-
! P2
|0||1||1||0
|-
! P3
|0||1||0||1
|}
|
{| border="1"
|+'''NECESIDAD'''
!Proceso !!R1 !!R2 !!R3 !!R4
|-
! P1
|1||1||1||1
|-
! P2
|3||1||2||4
|-
! P3
|3||2||2||1
|}
|}
 
a.
Corriendo el algoritmo del banquero:
*Req[1] <math>\le</math> Nec[1]? (0 1 1 1) <math>\le</math> (1 1 1 1) Sí
*Req[1] <math>\le</math> Disp? (0 1 1 1) <math>\le</math> (1 3 3 1) Sí
 
Entonces se cambian:
*Disp -= Req[1] <math>\to</math> Disp = (1 2 2 0)
*Asig[1] += Req[1] <math>\to</math> Asig[1] = (2 1 1 3)
*Nec[1] -= Req[1] <math>\to</math> Nec[1] = (1 0 0 0)
 
Corriendo el algoritmo de seguridad:
 
{| class="wikitable" style="text-align:center"
|
{| border="1"
|+ '''AB'''
!PASO
|-
|0
|-
|1
|-
|2
|-
|3
|}
||
{| border="1"
|+'''FINISH'''
!P1 !!P2 !!P3
|-
|F||F||F
|-
|T||F||F
|-
|T||T||F
|-
|T||T||T
|}
||
{| border="1"
|+'''WORK'''
!R1 !!R2 !!R3 !!R4
|-
|1||3||3||1
|-
|3||4||4||4
|-
|3||4||5||4
|-
|3||5||5||5
|}
||
{| border="1"
|+'''ENTONCES'''
!Puedo Seguir?
|-
|P1 cumple -> Work += Asig[1]
|-
|P2 cumple -> Work += Asig[2]
|-
|P3 cumple -> Work += Asig[3]
|-
|'''SUCCESS'''
|}
|}
 
Por lo tanto, este pedido puede ser satisfecho.
 
b.
Corriendo el algoritmo del banquero:
*Req[2] <math>\le</math> Nec[2]? (1 0 0 1) <math>\le</math> (3 1 2 4) Sí
*Req[2] <math>\le</math> Disp? (1 0 0 1) <math>\le</math> (1 3 3 1) Sí
 
Entonces se cambian:
*Disp -= Req[2] <math>\to</math> Disp = (0 3 3 0)
*Asig[2] += Req[2] <math>\to</math> Asig[2] = (1 1 1 1)
*Nec[2] -= Req[2] <math>\to</math> Nec[2] = (2 1 2 3)
 
Corriendo el algoritmo de seguridad:
 
{| class="wikitable" style="text-align:center"
|
{| border="1"
|+ '''AB'''
!PASO
|-
|0
|}
||
{| border="1"
|+'''FINISH'''
!P1 !!P2 !!P3
|-
|F||F||F
|}
||
{| border="1"
|+'''WORK'''
!R1 !!R2 !!R3 !!R4
|-
|0||3||3||0
|}
||
{| border="1"
|+'''ENTONCES'''
!Puedo Seguir?
|-
|'''FAILED'''
|}
|}
 
Por lo tanto, este pedido '''no''' puede ser satisfecho.
 
Si esta nueva situación mantiene al sistema en estado "seguro", los recursos son adjudicados. Si el nuevo estado es "inseguro", p(i) debe esperar y, además, se restaura el anterior estado de asignación total de recursos.
Si esta nueva situación mantiene al sistema en estado "seguro", los recursos son adjudicados. Si el nuevo estado es "inseguro", p(i) debe esperar y, además, se restaura el anterior estado de asignación total de recursos.


==Ejercicio 11:[*]==
===Ejercicio 11*===
<br>a) Mala idea pues es muy costoso hacerlo, y si se hace cada vez que se asigna un recurso peor.
a. Mala idea pues es muy costoso hacerlo, y si se hace cada vez que se asigna un recurso peor.
<br>b) Puede tardarse bastante tiempo en detectarse el deadlock si el intervalo es muy grande, desperdiciando recursos en el transcurso.
 
<br>c) Elijo este, porque se corre el algoritmo una cantidad minima de veces, y su desventaja es como establecer la cota para que no corra muy seguido ni que detecte el deadlock muy tarde.  
b. Puede tardarse bastante tiempo en detectarse el deadlock si el intervalo es muy grande, desperdiciando recursos en el transcurso.
<br>
 
==Ejercicio 12:==
c. Elijo este, porque se corre el algoritmo una cantidad minima de veces, y su desventaja es como establecer la cota para que no corra muy seguido ni que detecte el deadlock muy tarde.  
<br>La frecuencia es ejecutarlo cada vez que se pide un recurso, si no no anda. Los problema es que es un algoritmo muy costoso para ejecutarlo cada vez que se pide un recurso. Otro problema es que quizas se blockean muchos procesos para no entrar en estados inseguros, que realmente no terminarian en deadlock, deteriorando mucho la performance del sistema.  
 
<br>
===Ejercicio 12===
==Ejercicio 13:[*]==
La frecuencia es ejecutarlo cada vez que se pide un recurso, si no no anda. Los problema es que es un algoritmo muy costoso para ejecutarlo cada vez que se pide un recurso. Otro problema es que quizas se blockean muchos procesos para no entrar en estados inseguros, que realmente no terminarian en deadlock, deteriorando mucho la performance del sistema.  
<br>a) Secuencia: P3, P4, P1, P2. Esto significa que si ejecuto los procesos en ese orden, todos los programas terminaran satisfactoriamente.
 
<br>b) Por que P3 tiene todos los recursos que necesita para finalizar, entonces si existia una secuencia antes, agarro esa secuencia, pongo P3 al principio, y me da una secuencia segura valida para el nuevo estado.
===Ejercicio 13*===
<br>c) No puede ser satisfecho. El sistema debe blockear P4, y esperar a que se le puedan dar los recursos sin pasar a un estado no seguro.  
a. Secuencia: '''P3 - P4 - P1 - P2'''. Esto significa que si ejecuto los procesos en ese orden, todos los programas terminaran satisfactoriamente.
<br>
 
==Ejercicio 14:[*]==
b. Por que P3 tiene todos los recursos que necesita para finalizar, entonces si existia una secuencia antes, agarro esa secuencia, pongo P3 al principio, y me da una secuencia segura valida para el nuevo estado.
<br>Si los recursos son unicos (es decir el MAX de todos es 1), estoy en deadlock. Si hay mas de 1 del recurso, entonces puede que no, ya que otro proceso que no esta en esa espera circular, libera 1 instancia de un recurso de los que 1 esta esperando, y rompe el circulo y todo termina normalmente.  
 
<br>
c. No puede ser satisfecho. El sistema debe blockear P4, y esperar a que se le puedan dar los recursos sin pasar a un estado no seguro.  
==Ejercicio 15:[*]==
 
<br>a)
===Ejercicio 14*===
Si los recursos son unicos (es decir el MAX de todos es 1), estoy en deadlock. Si hay mas de 1 del recurso, entonces puede que no, ya que otro proceso que no esta en esa espera circular, libera 1 instancia de un recurso de los que 1 esta esperando, y rompe el circulo y todo termina normalmente.  
 
===Ejercicio 15*===
a.
 
{| class="wikitable" style="text-align:center"
|
{| border="1"
|+'''ASIGNACIÓN'''
!Proceso !!R1 !!R2 !!R3 !!R4
|-
! P1
|0||1||0||0
|-
! P2
|2||0||0||1
|-
! P3
|3||0||3||0
|-
! P4
|2||1||1||1
|-
! P5
|0||0||2||0
|}
|
{| border="1"
|+'''NECESIDAD'''
!Proceso !!R1 !!R2 !!R3 !!R4
|-
! P1
|0||0||0||0
|-
! P2
|2||0||2||0
|-
! P3
|0||0||0||0
|-
! P4
|1||0||0||0
|-
! P5
|0||0||2||1
|}
|}
 
Corriendo el algoritmo de seguridad:


<br>||Asignacion ||Necesidad ||
{| class="wikitable" style="text-align:center"
<br>||0 1 0 0 ||0 0 0 0 ||
|
<br>||2 0 0 1 ||2 0 2 0 ||
{| border="1"
<br>||3 0 3 0 ||0 0 0 0 ||
|+ '''AB'''
<br>||2 1 1 1 ||1 0 0 0 ||
!PASO
<br>||0 0 2 0 ||0 0 2 1 ||
|-
<br>
|0
<br>Corriendo el algoritmo de seguridad:
|-
<br>||Finish  || Work || P[i] tq Finish[i] = F y Nec[i] <= Work ||
|1
<br>||F F F F F|| 0 0 0 0 || P[1] cumple -> Work += Asig[1] ||
|-
<br>||T F F F F|| 0 1 0 0 || P[3] cumple -> Work += Asig[3] ||
|2
<br>||T F T F F|| 3 1 3 0 || P[2] cumple -> Work += Asig[2] ||
|-
<br>||T T T F F|| 5 1 5 0 || P[4] cumple -> Work += Asig[4] ||
|3
<br>||T T T T F|| 7 2 6 1 || P[5] cumple -> Work += Asig[5] ||
|-
<br>||T T T T T|| 7 2 8 1 || LISTO ||
|4
<br>Rta - Si.
|-
|5
|}
||
{| border="1"
|+'''FINISH'''
!P1 !!P2 !!P3 !!P4 !!P5
|-
|F||F||F||F||F
|-
|T||F||F||F||F
|-
|T||F||T||F||F
|-
|T||T||T||F||F
|-
|T||T||T||T||F
|-
|T||T||T||T||T
|}
||
{| border="1"
|+'''WORK'''
!R1 !!R2 !!R3 !!R4
|-
|0||0||0||0
|-
|0||1||0||0
|-
|3||1||3||0
|-
|5||1||5||0
|-
|7||2||6||1
|-
|7||2||8||1
|}
||
{| border="1"
|+'''ENTONCES'''
!Puedo Seguir?
|-
|P1 cumple -> Work += Asig[1]
|-
|P3 cumple -> Work += Asig[3]
|-
|P2 cumple -> Work += Asig[2]
|-
|P4 cumple -> Work += Asig[4]
|-
|P5 cumple -> Work += Asig[5]
|-
|'''SUCCESS'''
|}
|}


<br>b)
b.

Revisión del 15:55 5 nov 2006

Ejercicio 1

Solamente si el mismo tiene varios hilos.

Ejercicio 2*

Sí. Pero la administracion de procesador/memoria solucionan estos problemas. (Al hacerlos recursos compartibles entre varios procesos).

Ejercicio 3

La idea informal es: Si hay un solo proceso, lo ejecuto y como hay 4 y usa 2 anda todo bien. Si hay n, supongo "inductivamente" que para n - 1 no hay deadlock. Si hay algun proceso que tiene 2, ese tiene todo lo que necesita y puede terminar. Si no, como maximo son 3 procesos, cada uno tiene maximo 1, entonces sobra uno y todos tienen uno, entonces se lo doy a alguno y ese termina, o sobran 2 o mas, y se los doy a uno ese termina y recursivamente con n-1 no hay deadlock.

Ejercicio 4*

Deadlock es que un proceso espera un evento que nunca va a ocurrir. En tiempo infinito los procesos del deadlock van a seguir blockeados... Inhanicion es que no recive, o recive poco procesador un proceso. En tiempo infinito, el proceso terminaria ejecutandose completamente.

Ejercicio 5*

Una dificultad de hacer roll-back es que se deshacen todos los acciones anteriores recorriendo el "log", y esto puede hacer que se deshagan los cambios de otros procesos. Otra dificultad es que hay operaciones que no se pueden deshacer (Ej: imprimir algo). Ademas es caro mantener informacion para poder hacer un roll back. Las ventajas es que si todo sale bien, el sistema sigue funcionando y no se perdio informacion.

Ejercicio 6

a. se puede.

b. no se puede.

c. no se puede.

d. se puede.

e. se puede.

f. se puede.

Ejercicio 7*

a.

MAX
Proceso R1 R2 R3 R4
P1 0 0 1 2
P2 1 7 5 0
P3 2 3 5 6
P4 0 6 5 2
P5 0 6 5 6

-

ASIGNACIÓN
Proceso R1 R2 R3 R4
P1 0 0 1 2
P2 1 0 0 0
P3 1 3 5 4
P4 0 6 3 2
P5 0 0 1 4

=

NECESIDAD
Proceso R1 R2 R3 R4
P1 0 0 0 0
P2 0 7 5 0
P3 1 0 0 2
P4 0 0 2 0
P5 0 6 4 2

b.

AB
PASO
0
1
2
3
4
5
FINISH
P1 P2 P3 P4 P5
F F F F F
T F F F F
T F T F F
T T T F F
T T T T F
T T T T T
WORK
R1 R2 R3 R4
1 5 2 0
1 5 3 2
2 8 8 6
3 8 8 6
3 14 11 8
3 14 12 12
ENTONCES
Puedo Seguir?
P1 cumple -> Work += Asig[1]
P3 cumple -> Work += Asig[3]
P2 cumple -> Work += Asig[2]
P4 cumple -> Work += Asig[4]
P5 cumple -> Work += Asig[5]
SUCCESS

Por lo tanto, el sistema está en estado seguro. La secuencia segura es P1 - P3 - P2 - P4 - P5

c. Corriendo el algoritmo del banquero:

  • Req[2] Nec[2]? (0 4 2 0) (0 7 5 0) Sí
  • Req[2] Disp? (0 4 2 0) (1 5 2 0) Sí

Entonces se cambian:

  • Disp -= Req[2] Disp = (1 1 0 0)
  • Asig[2] += Req[2] Asig[2] = (1 4 2 0)
  • Nec[2] -= Req[2] Nec[2] = (0 3 3 0)

Corriendo el algoritmo de Seguridad:

AB
PASO
0
1
2
3
4
5
FINISH
P1 P2 P3 P4 P5
F F F F F
T F F F F
T F T F F
T F T T F
T T T T F
T T T T T
WORK
R1 R2 R3 R4
1 1 0 0
1 1 1 2
2 4 6 6
2 10 8 8
3 14 10 8
3 14 11 12
ENTONCES
Puedo Seguir?
P1 cumple -> Work += Asig[1]
P3 cumple -> Work += Asig[3]
P4 cumple -> Work += Asig[4]
P2 cumple -> Work += Asig[2]
P5 cumple -> Work += Asig[5]
SUCCESS

Por lo tanto, el pedido puede ser satisfecho.

Ejercicio 8

Sí. Luego ejecuto P1 - P3 - P2.

Ejercicio 9*

Tengo dos procesos que tienen MAX 10 y cada uno tiene 6. En esta sesion uno de los procesos con sus 6 llega a terminar, los libera, y el otro puede terminar tranquilamente.

Ejercicio 10*

MAX
Proceso R1 R2 R3 R4
P1 3 1 1 3
P2 3 2 3 4
P3 3 3 2 2
ASIGNACIÓN
Proceso R1 R2 R3 R4
P1 2 0 0 2
P2 0 1 1 0
P3 0 1 0 1
NECESIDAD
Proceso R1 R2 R3 R4
P1 1 1 1 1
P2 3 1 2 4
P3 3 2 2 1

a. Corriendo el algoritmo del banquero:

  • Req[1] Nec[1]? (0 1 1 1) (1 1 1 1) Sí
  • Req[1] Disp? (0 1 1 1) (1 3 3 1) Sí

Entonces se cambian:

  • Disp -= Req[1] Disp = (1 2 2 0)
  • Asig[1] += Req[1] Asig[1] = (2 1 1 3)
  • Nec[1] -= Req[1] Nec[1] = (1 0 0 0)

Corriendo el algoritmo de seguridad:

AB
PASO
0
1
2
3
FINISH
P1 P2 P3
F F F
T F F
T T F
T T T
WORK
R1 R2 R3 R4
1 3 3 1
3 4 4 4
3 4 5 4
3 5 5 5
ENTONCES
Puedo Seguir?
P1 cumple -> Work += Asig[1]
P2 cumple -> Work += Asig[2]
P3 cumple -> Work += Asig[3]
SUCCESS

Por lo tanto, este pedido puede ser satisfecho.

b. Corriendo el algoritmo del banquero:

  • Req[2] Nec[2]? (1 0 0 1) (3 1 2 4) Sí
  • Req[2] Disp? (1 0 0 1) (1 3 3 1) Sí

Entonces se cambian:

  • Disp -= Req[2] Disp = (0 3 3 0)
  • Asig[2] += Req[2] Asig[2] = (1 1 1 1)
  • Nec[2] -= Req[2] Nec[2] = (2 1 2 3)

Corriendo el algoritmo de seguridad:

AB
PASO
0
FINISH
P1 P2 P3
F F F
WORK
R1 R2 R3 R4
0 3 3 0
ENTONCES
Puedo Seguir?
FAILED

Por lo tanto, este pedido no puede ser satisfecho.

Si esta nueva situación mantiene al sistema en estado "seguro", los recursos son adjudicados. Si el nuevo estado es "inseguro", p(i) debe esperar y, además, se restaura el anterior estado de asignación total de recursos.

Ejercicio 11*

a. Mala idea pues es muy costoso hacerlo, y si se hace cada vez que se asigna un recurso peor.

b. Puede tardarse bastante tiempo en detectarse el deadlock si el intervalo es muy grande, desperdiciando recursos en el transcurso.

c. Elijo este, porque se corre el algoritmo una cantidad minima de veces, y su desventaja es como establecer la cota para que no corra muy seguido ni que detecte el deadlock muy tarde.

Ejercicio 12

La frecuencia es ejecutarlo cada vez que se pide un recurso, si no no anda. Los problema es que es un algoritmo muy costoso para ejecutarlo cada vez que se pide un recurso. Otro problema es que quizas se blockean muchos procesos para no entrar en estados inseguros, que realmente no terminarian en deadlock, deteriorando mucho la performance del sistema.

Ejercicio 13*

a. Secuencia: P3 - P4 - P1 - P2. Esto significa que si ejecuto los procesos en ese orden, todos los programas terminaran satisfactoriamente.

b. Por que P3 tiene todos los recursos que necesita para finalizar, entonces si existia una secuencia antes, agarro esa secuencia, pongo P3 al principio, y me da una secuencia segura valida para el nuevo estado.

c. No puede ser satisfecho. El sistema debe blockear P4, y esperar a que se le puedan dar los recursos sin pasar a un estado no seguro.

Ejercicio 14*

Si los recursos son unicos (es decir el MAX de todos es 1), estoy en deadlock. Si hay mas de 1 del recurso, entonces puede que no, ya que otro proceso que no esta en esa espera circular, libera 1 instancia de un recurso de los que 1 esta esperando, y rompe el circulo y todo termina normalmente.

Ejercicio 15*

a.

ASIGNACIÓN
Proceso R1 R2 R3 R4
P1 0 1 0 0
P2 2 0 0 1
P3 3 0 3 0
P4 2 1 1 1
P5 0 0 2 0
NECESIDAD
Proceso R1 R2 R3 R4
P1 0 0 0 0
P2 2 0 2 0
P3 0 0 0 0
P4 1 0 0 0
P5 0 0 2 1

Corriendo el algoritmo de seguridad:

AB
PASO
0
1
2
3
4
5
FINISH
P1 P2 P3 P4 P5
F F F F F
T F F F F
T F T F F
T T T F F
T T T T F
T T T T T
WORK
R1 R2 R3 R4
0 0 0 0
0 1 0 0
3 1 3 0
5 1 5 0
7 2 6 1
7 2 8 1
ENTONCES
Puedo Seguir?
P1 cumple -> Work += Asig[1]
P3 cumple -> Work += Asig[3]
P2 cumple -> Work += Asig[2]
P4 cumple -> Work += Asig[4]
P5 cumple -> Work += Asig[5]
SUCCESS

b.