Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema9 6
Tema9 6
6: Sincronizacin de Procesos
Antecedentes
El acceso concurrente a datos compartidos puede dar pie
a inconsistencia de datos
Mantener la consistencia de los datos requiere
mecanismos para asegurar el orden de ejecucin de los procesos que los comparten
Tratemos de dar una solucin al problema del productor-
consumidor. Usamos una variable entera llamada count que guarda el nmero de elementos en el buffer
Inicialmente, count vale 0 Es incrementado por el productor cuando produce un nuevo valor y lo almacena en el buffer Es decrementado por el consumidor cuando extrae un elemento del buffer
Tema 9.6: 2
Productor
while (true) { /* produce un elemento y lo pone en nextProduced */ while (count == BUFFER_SIZE) { // nada } buffer [in] = nextProduced; in = (in + 1) % BUFFER_SIZE; count++; }
Tema 9.6: 3
Consumidor
while (true)
{
while (count == 0) { // nada
}
nextConsumed = buffer[out]; out = (out + 1) % BUFFER_SIZE; count--; /* consume el elemento en nextConsumed */ }
Tema 9.6: 4
count++ podra ser implementado en lenguaje mquina as register1 = count register1 = register1 + 1 count = register1
count-- podra ser implementado as register2 = count register2 = register2 - 1 count = register2
S0: productor register1 = count {register1 = 5} S1: productor register1 = register1 + 1 {register1 = 6} S2: consumidor register2 = count {register2 = 5} S3: consumidor register2 = register2 - 1 {register2 = 4} S4: productor count = register1 {count = 6 } S5: consumidor count = register2 {count = 4}
Tema 9.6: 5
seccin crtica, que no debe intercalarse con las secciones crticas de los dems procesos
En las secciones crticas de los procesos se encuentra el cdigo
que los procesos pueden usar para conseguir la exclusin mutua de las secciones crticas.
El protocolo consta de:
Tema 9.6: 6
3. Espera limitada - Hay un lmite para el nmero de veces que otros procesos pueden entrar a sus secciones crticas despus de que un proceso ha solicitado entrar en su seccin crtica y antes de que se le otorgue la autorizacin para hacerlo Asumimos que cada proceso se ejecuta con velocidad 0 No hacemos supuestos acerca de las velocidades relativas de los N procesos
Tema 9.6: 7
Primer intento
while (true)
{
while (turno 0); SECCIN CRTICA turno = 1; SECCIN RESTANTE }
Satisface la exclusin mutua No cumple la condicin de progreso Requiere una alternancia estricta de
Tema 9.6: 8
Segundo intento
while (true)
{
indicador[0] = TRUE; while (indicador[1]);
Tema 9.6: 9
(LOAD y STORE) son atmicas; no pueden ser interrumpidas Los dos procesos comparten dos variables: int turno Boolean indicador[2] La variable turno indica a quin le toca entrar en la seccin crtica Los indicadores se usan para indicar si un proceso est listo para entrar en la seccin crtica. indicador[i] = TRUE implica que el proceso Pi est listo
SECCIN CRTICA
indicador[0] = FALSE; SECCIN RESTANTE }
limitada
limitada
Hardware de Sincronizacin
Muchos sistemas proveen soporte hardware para resolver
el problema de la exclusin mutua Una solucin en mquinas con un solo procesador es deshabilitar las interrupciones El cdigo que se est ejecutando no puede ser retirado de la CPU No es buena solucin porque el SO pierde el control temporalmente En sistemas multiprocesadores no es eficiente Las mquinas actuales proveen instrucciones atmicas especiales Atmica = no interrumpible Chequeo y asignacin simultnea Intercambio de dos palabras de memoria
lock = FALSE; // }
Silberschatz, Galvin and Gagne 2005
seccin restante
Instruccin Swap
Definicin:
while (true) { key = TRUE; while ( key == TRUE) Swap (&lock, &key );
// seccin crtica
Semforos
Herramienta de sincronizacin que no requiere espera activa Semforo S variable entera Dos operaciones estndar modifican S: wait() y signal()
Llamadas originalmente por Dijkstra P() y V() Slo puede accederse al semforo a travs de las dos operaciones atmicas wait (S) {
no acotado
Semforo binario el valor entero puede variar slo entre 0 y 1
semforo binario
Uso de semforo para exclusin mutua
// inicializado a 1
Implementacin de Semforos
Se debe garantizar que dos procesos no ejecuten wait () y
Se desaprovecha la CPU
Dos operaciones:
block coloca el proceso llamante en la cola de espera apropiada wakeup saca un proceso de la cola de espera y lo coloca en la cola de listos
Implementacin de wait: wait (S){ valor--; if (valor < 0) { aade este proceso a la cola de espera block(); } }
Implementacin de signal: signal (S){ valor++; if (valor <= 0) { saca un proceso P de la cola de espera wakeup(P); } }
indefinidamente un evento que slo puede ser causado por uno de los procesos que esperan Sean S y Q dos semforos inicializados a 1 P0 P1
wait (S); wait (Q);
wait (Q);
. . . signal (S); signal (Q);
wait (S);
. . . signal (Q); signal (S);
Estructura del proceso productor while (true) { // produce un elemento wait (empty); wait (mutex); // aade el elemento al buffer signal (mutex);
signal (full);
}
wait (full);
wait (mutex); // saca un elemento del buffer signal (mutex); signal (empty); // consume el elemento sacado }
concurrentes Lectores slo leen el conjunto de datos; no realizan ninguna modificacin Escritores pueden leer y escribir
Problema permitir a muchos lectores leer al mismo tiempo.
signal (wrt) ; }
Estructura de un proceso lector while (true) { wait (mutex) ; readcount ++ ; if (readcount == 1) wait (wrt) ; signal (mutex) // se realiza la lectura wait (mutex) ; readcount -- ; if (readcount == 0) signal (wrt) ; signal (mutex) ; }
Datos compartidos
Estructura del proceso Filsofo i: while (true) { wait ( chopstick[i] ); wait ( chopstick[ (i + 1) % 5] ); // come signal ( chopstick[i] ); signal (chopstick[ (i + 1) % 5] );
// piensa
}
Permitir que un filsofo tome los palillos si los dos estn disponibles
Que haya un filsofo distinto que tome el palillo izquierdo primero