Diferencia entre revisiones de «Cerrojos»
De Wiki de Sistemas Operativos
(esbozo (revisión)) |
(Añadir anotaciones y ejemplo de clase) |
||
Línea 2: | Línea 2: | ||
<source lang="c"> | <source lang="c"> | ||
− | while(cerrojo | + | int cerrojo = 1; /* Inicializamos la variable cerrojo. Esto sería sólo válido para |
− | cerrojo = | + | hilos, ya que los procesos no comparten espacio de memoria */ |
− | ... | + | |
− | cerrojo = | + | while(cerrojo == 0); // Protocolo de |
+ | cerrojo = 0; // entrada | ||
+ | |||
+ | ... // Sección crítica | ||
+ | |||
+ | cerrojo = 1; // Protocolo de salida | ||
</source> | </source> | ||
− | + | 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 14: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);
}