Diferencia entre revisiones de «Solución ejercicio 1»

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
Línea 77: Línea 77:
 
No habria que ejecutar otra vez la instruccion down, cuando ésta ha bloqueado anteriormente, por ejemplo en el tiempo 8-9 habria que volver a comprobar si el semaforo esta a 1 ¿no? y si es asi ponerlo a 0.
 
No habria que ejecutar otra vez la instruccion down, cuando ésta ha bloqueado anteriormente, por ejemplo en el tiempo 8-9 habria que volver a comprobar si el semaforo esta a 1 ¿no? y si es asi ponerlo a 0.
  
--[[Usuario:DvS 013|DvS 013]] 18:33 9 may 2011 (UTC) : Vale había leído mal lo del contador =P, creo que lo he corregido y me sale la misma solución
+
--[[Usuario:DvS 013|DvS 013]] 18:33 9 may 2011 (UTC) : Vale había leído mal lo del contador =P, creo que lo he corregido y me sale la misma solución. y contestando a [[Usuario:Jmf bsk|Jmf bsk]], no habria que ejecutarlo de nuevo puesto que bloqueo despues de realizar el down y el up de p1 ya lo que hace es ponerlo en estado activo no ponerle el contador a 1 (sigue siendo 0 durante toda la ejecución).

Revisión del 20:36 9 may 2011

     X = El proceso pasa a estado bloqueado.
     / = El proceso pasa a estado preparado.


     |   |   | #1| #2| #3| #4| #5| #1|   |   |   | #2| #3| #4|   |   |   | #5| fin de ejecucion
   p1|   |   |---|---|---|---|---|---|   |   |   |---|---|---|   |   |   |---|   |   |
     |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
     | #1| #2|   |   |   |   |   |   | #3| #4| #1|   |   |   | #2| #3| #4| fin de ejecucion
   p2|---|---X   |   |   |   |   /   |---|---|---|   |   |   |---|---|---|   |   |   |
     |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
     |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
     0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20

El proceso P2 comienza su ejecucion y al hacer el down al semaforo s2 que vale 0 bloquea , ya que los semaforo es un sincronizacion bloqueante, p1 comienza su ejecucion hasta que se hace up(s2) y agota su ventana de tiempo y p2 puede comenzar su ejecucion.

--DvS 013 15:09 9 may 2011 (UTC) : había conflicto cuando le he dado a subir así que pongo debajo lo que yo estaba editando antes de que se subiera nada

p1:
 for (int i=0; i<2; i++) {  #1
    down(s1);               #2
    f1();                   #3
    if (get(s1) == 0)       #4
        up(s2);             #5
 }
P2:
 for (int i=0; i<2; i++) {   #1
    down(s2);               #2
    f2();                   #3
    up(s1);                 #4
 }
             X : se ejecuta el planificador,  /: El proceso pasa a estado bloqueado.
             > : fin del proceso, #nº : número de instrucción, @: El proceso pasa a estado preparado.

       |i2=0   |i1=0       |       i1=1|       i2=1|           |       i2=2|       i1=2|
       |   |   | #1| #2| #3| #4| #5| #1|   |   |   | #2| #3| #4|   | #5| #1|   |   |   |
P1     |   |   |---|---|---|---|---|---|   |   |   |---|---|---|   |---|--->   |   |   |
s1     | 1         | 0                     | 1     | 0                         | 1     |
       | #1| #2|   |   |   |   |   |   | #3| #4| #1|   |   |   | #2|   |   | #3| #4| #1|
P2     |---|---/   |   |   |   |   @   |---|---|---|   |   |   |---/   @   |---|---|--->
s2     | 0   0                   0                               0   0 |   |   |   |   |
planif X   |   X   |   |   X   |   |   X   |   |   X   |   |   X   X   |   X   |   |   X
       |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
       0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20


Nueva solución: Con respecto a la primera, una simple aclaración --David 15:26 9 may 2011 (UTC)

     X = El proceso pasa a estado bloqueado.
     / = El proceso pasa a estado preparado.


     |   |   | #1| #2| #3| #4| #5| #1|   |   |   | #2| #3| #4|   | #5| #1|   | 
   p1|   |   |---|---|---|---|---|---|   |   |   |---|---|---|   |---|---|   |   |   |
     |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
     | #1| #2|   |   |   |   |   |   | #3| #4| #1|   |   |   | #2|   |   | #3| #4| #1|
   p2|---|---X   |   |   |   |   /   |---|---|---|   |   |   |---X   /   |---|---|---|
     |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
     |___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
     0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20

Como aclaración: cuando se realiza el up de un semáforo que vale 0, si hay procesos en su lista de semáforos, se coge el primero y se pasa a estado preparado, valiendo el contador del semáforo 0, por eso en el instante 15 al hacer el down de s2 vuelve a bloquear.

--Josmorgav1 15:32 9 may 2011 (UTC) Una aclaración al compañero David Martin, el contador de semáforo s2, en un principio vale 0, y como el primer proceso en ejecutar es P2, al hacer el down(s2); bloquea, creo que en tu solución consideras que s2 vale 1. Desde mi punto de vista, la solución por ahora más correcta, es la del compañero David Suárez

--Jherrera Con respecto a la solución de Dvs no es correcta a partir del instante 2, ya que interpreto que el proceso 2 ejecuta la instrucción nº3 en vez de pasar a bloqueado. He realizado el ejercicio al igual que David (última solución propuesta) y pienso que está totalmente correcto.

--Jorcalmar 16:55 9 may 2011 (UTC) La última solución propuesta coincide con la que me ha salido a mí, espero que esté bien.

--Jmf bsk 18:13 9 may 2011 (UTC) No habria que ejecutar otra vez la instruccion down, cuando ésta ha bloqueado anteriormente, por ejemplo en el tiempo 8-9 habria que volver a comprobar si el semaforo esta a 1 ¿no? y si es asi ponerlo a 0.

--DvS 013 18:33 9 may 2011 (UTC) : Vale había leído mal lo del contador =P, creo que lo he corregido y me sale la misma solución. y contestando a Jmf bsk, no habria que ejecutarlo de nuevo puesto que bloqueo despues de realizar el down y el up de p1 ya lo que hace es ponerlo en estado activo no ponerle el contador a 1 (sigue siendo 0 durante toda la ejecución).