Solución ejercicio 1

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
     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
             > : fin del proceso
            #nº : número de insturcción

       |i2=0       |i1=0       |    i2=1   |    i1=1   |           |       i2=2|i1=2   |
       |   |   |   | #1| #2| #3|   |   |   | #4| #1| #2| #3| #4| #5|   |   |   | #1|   |
P1     |   |   |   |---|---|---|   |   |   |---|---|---|---|---|---|   |   |   |--->   |
s1     | 1             | 0     | 1                 | 0                 | 1         |   |
       | #1| #2| #3|   |   |   | #4| #1| #2|   |   |   |   |   |   | #3| #4| #1|   |   |
P2     |---|---|---|   |   |   |---|---|---|   |   |   |   |   |   |---|---|--->   |   |
s2     | 1 | 0                                                 | 0 |   |   |   |   |   |
planif 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.