Diferencia entre revisiones de «Discusión:Mecanismos de sincronización»

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
 
(No se muestran 2 ediciones intermedias del mismo usuario)
Línea 47: Línea 47:
  
 
----
 
----
Esto no tieme ningún sentido:
+
Lo del comentario anterior es cierto excepto lo siguiente, que  no tiene sentido:
 
<source lang ="c">
 
<source lang ="c">
 
int compartida = 1, tmp;
 
int compartida = 1, tmp;
 
</source>
 
</source>
¿Está asignando dos valores a la misma variable?
+
¿Está asignando dos valores a la misma variable?  
 +
Aparte de ésto, creo que tal y como está planteado el ejemplo debería ser como sigue:
 +
<source lang ="c">
 +
int compartida = 1;              //Inicialización, puesta de manera ilustrativa pero irrelevante su valor y cuando se hace
 +
/* Código no concurrente */
 +
//...
 +
/* Modificación de variable compartida, código concurrente */
 +
{     
 +
        int tmp;                //Limitamos la existencia de la variable temporal con las llaves
 +
        retry:                  //GOTO y etiqueta fuera sin for, si lo viera algún talibán de C...
 +
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */
 +
        tmp++;                  /* actualizo la varible temporal. */
 +
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */
 +
            goto retry;          /* mientras operaba con la variable temporal. */
 +
        else
 +
            compartida = tmp;    //Esto es chungo, porque aunque sea verdad el código del if nada
 +
}                                //garantiza que la variable compartida no cambie mientras se llega al
 +
                                //else
 +
</source>
 +
 
 +
De todas maneras, por lo que he puesto en el último comentario, el ejemplo creo que tampoco es bueno. Al final, la operación de comprobación exige un bloque sincronizado que englobe al if-else, paradigma de las técnicas no optimistas

Revisión actual del 20:52 10 may 2011

- A mi enteder en el fragmento de codigo de :

int compartida = 1, tmp;
retry:
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */
        tmp++;                   /* actualizo la varible temporal. */
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */
            goto retry;          /* mientras operaba con la variable temporal. */

¿no deberia en vez de modificar la variable temporal , modificar la variable compartida?

Ya que como dice al principio los dos procesos tienen el mismo codigo entonces, en ambos la variable compartida no es modificada, se modifica la variable temporal.

Ejemplo: El proceso A empieza a ejecutarse y se queda en la linea tmp ++ por que agota su ventana de tiempo, el proceso B empieza a ejecutar, y tmb se queda en estado preparado por que agota su ventana de tiempo en la instruccion tmp ++, en este caso ambos procesos han acedido al recurso comportido y la instruccion if la cumple.

¿Que os parece?



Ese trozo de código es incompleto a mi parecer. ¿Lo que dices es esto?

int compartida = 1, tmp;
retry:
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */
        '''compartida++''';                   /* actualizo la varible */
        if (compartida != '''tmp + 1''') /* compruebo si la variable compartida ha sido modificada */
            goto retry;          /* mientras operaba con la variable temporal. */

No creo que actualizar la variable compartida antes de hacer ninguna comprobación sea correcto.

Pienso que seria mejor actualizar el valor de la variable una vez hecha la comprobación:

int compartida = 1, tmp;
retry:
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */
        tmp++;                   /* actualizo la varible temporal. */
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */
            goto retry;          /* mientras operaba con la variable temporal. */
        '''else
            compartida = tmp;''' /* Actualizo el valor de la variable compartida. */

Lo más probable es que la intención de ese trozo fuese mostrar la idea principal, por eso no aparece la modificación de la variable compartida. Pero tampoco estoy seguro de esto. ¿Alguna otra opinión?


Lo del comentario anterior es cierto excepto lo siguiente, que no tiene sentido:

int compartida = 1, tmp;

¿Está asignando dos valores a la misma variable? Aparte de ésto, creo que tal y como está planteado el ejemplo debería ser como sigue:

int compartida = 1;              //Inicialización, puesta de manera ilustrativa pero irrelevante su valor y cuando se hace
/* Código no concurrente */
//...
/* Modificación de variable compartida, código concurrente */
{       
        int tmp;                 //Limitamos la existencia de la variable temporal con las llaves
        retry:                   //GOTO y etiqueta fuera sin for, si lo viera algún talibán de C...
        tmp = compartida;        /* almaceno el valor de la variable compartida en una temporal. */
        tmp++;                   /* actualizo la varible temporal. */
        if (compartida+1 != tmp) /* compruebo si la variable compartida ha sido modificada */
            goto retry;          /* mientras operaba con la variable temporal. */
        else
            compartida = tmp;    //Esto es chungo, porque aunque sea verdad el código del if nada 
}                                //garantiza que la variable compartida no cambie mientras se llega al 
                                 //else

De todas maneras, por lo que he puesto en el último comentario, el ejemplo creo que tampoco es bueno. Al final, la operación de comprobación exige un bloque sincronizado que englobe al if-else, paradigma de las técnicas no optimistas