Cerrojos
De Wiki de Sistemas Operativos
Revisión del 14:13 30 mar 2011 de Alexrdp (discusión | contribuciones) (Añadir anotaciones y ejemplo de clase)
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);
}