Diferencia entre revisiones de «Cerrojos»

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
(esbozo (revisión))
(Añadir anotaciones y ejemplo de clase)
Línea 2: Línea 2:
  
 
<source lang="c">
 
<source lang="c">
while(cerrojo != 0);
+
int cerrojo = 1;      /* Inicializamos la variable cerrojo. Esto sería sólo válido para
cerrojo = 1;
+
                        hilos, ya que los procesos no comparten espacio de memoria */
...
+
 
cerrojo = 0;
+
while(cerrojo == 0); // Protocolo de
 +
cerrojo = 0;         // entrada
 +
 
 +
...                   // Sección crítica
 +
 
 +
cerrojo = 1;         // Protocolo de salida
 
</source>
 
</source>
  
Esto es problemático.
+
Sin embargo, esto es problemático: Supongamos que tenemos únicamente un proceso con dos hilos (Hx y Hy) y el planificador retire al proceso Hx justo antes de ejecutarse la instrucción ''cerrojo = 0;''. A continuación el proceso Hy ejecuta su código, entra en la sección crítica (Esto puede ocurrir ya que cerrojo sigue a 1) y el planificador le retira el uso del procesador dentro de ésta. A continuación, se le vuelve a asignar el procesador a Hx.
 +
 
 +
De esta forma, tenemos a dos hilos ejecutando código de la sección crítica.
 +
 
  
 
Podemos implementar cerrojos mediante instrucciones especiales de comprobación y puesta a 0 y 1.
 
Podemos implementar cerrojos mediante instrucciones especiales de comprobación y puesta a 0 y 1.

Revisión del 15:13 30 mar 2011

Esto es un esbozo.

int cerrojo = 1;      /* Inicializamos la variable cerrojo. Esto sería sólo válido para
                         hilos, ya que los procesos no comparten espacio de memoria */

while(cerrojo == 0);  // Protocolo de
cerrojo = 0;          // entrada

...                   // Sección crítica

cerrojo = 1;          // Protocolo de salida

Sin embargo, esto es problemático: Supongamos que tenemos únicamente un proceso con dos hilos (Hx y Hy) y el planificador retire al proceso Hx justo antes de ejecutarse la instrucción cerrojo = 0;. A continuación el proceso Hy ejecuta su código, entra en la sección crítica (Esto puede ocurrir ya que cerrojo sigue a 1) y el planificador le retira el uso del procesador dentro de ésta. A continuación, se le vuelve a asignar el procesador a Hx.

De esta forma, tenemos a dos hilos ejecutando código de la sección crítica.


Podemos implementar cerrojos mediante instrucciones especiales de comprobación y puesta a 0 y 1.

int cerrojo = 0;

void lock() {
    while (__sync_lock_test_and_set(&cerrojo, 1));
}

void unlock() {
    __sync_lock_release(&cerrojo);
}