Sincronización de Procesos
Operating System Concepts – 9th Edition Silberschatz, Galvin and Gagne ©2013
Antecedentes
❑ Los procesos cooperativos o hilos, se pueden ejecutar de manera asíncrona y
compartiendo datos.
❑ Puede ocurrir una interrupción en cualquier momento, completando su
ejecución parcialmente.
❑ El acceso a datos compartidos por procesos concurrentes podría resultar datos
inconsistentes.
❑ Mantener la consistencia de datos requiere mecanismos para asegurar la
correcta ejecución de procesos cooperativos.
❑ Un ejemplo puede ser:
➢ El problema del consumidor-productor en el cual se llenan todos los buffers.
Se puede resolver con una variable entera contador que lleve la cuenta de
los buffers llenos. Inicialmente, contador se inicializa en 0 se incrementa por
el productor después de producir un nuevo buffer y se decrementa por el
consumidor, después que se consume el buffer.
Operating System Concepts – 9th Edition 5.2 Silberschatz, Galvin and Gagne ©2013
Productor - Consumidor
Operating System Concepts – 9th Edition 5.3 Silberschatz, Galvin and Gagne ©2013
Condición de competencia
❑ Las rutinas del productor y consumidor son correctas en forma separada.
❑ Tal vez no funcionen adecuadamente cuando se ejecuten de manera
concurrente.
❑ Los Hilos comparten la variable contador que sirve para los elementos
del buffer.
❑ Si el contador = 5 y los hilos del productor y consumidor se ejecutan
++cont y
--cont de manera concurrente.
❑ Después de la ejecución, el valor de contador podría ser 4, 5, o 6
❑ El valor adecuado para contador debería ser 5, que se genera solo si el
productor y consumidor se ejecutan secuencialmente.
Operating System Concepts – 9th Edition 5.4 Silberschatz, Galvin and Gagne ©2013
Condición de competencia
❑ counter++ se puede implementar como :
register1 = counter
register1 = register1 + 1
counter = register1
❑ counter-- se puede implementar como :
register2 = counter
register2 = register2 - 1
counter = register2
❑ Considere esta ejecución de intercalación con la variable inicialmente = 5
S0: producer execute register1 = counter {register1 = 5}
S1: producer execute register1 = register1 + 1 {register1 = 6}
S2: consumer execute register2 = counter {register2 = 5}
S3: consumer execute register2 = register2 – 1 {register2 = 4}
S4: producer execute counter = register1 {counter = 6 }
S5: consumer execute counter = register2 {counter = 4}
Operating System Concepts – 9th Edition 5.5 Silberschatz, Galvin and Gagne ©2013
Condición de competencia
❑ Se llega a un estado incorrecto contador = 4, en realidad hay 5.
❑ Si se invierte el orden de los procesos se llega a otro estado incorrecto = 6
❑ Si se permite la manipulación de la variable de manera concurrente se obtienen
los resultados incorrectos.
❑ Cuando varios hilos acceden y manipulan los mismos datos de manera
concurrente, y el resultado de la ejecución depende del orden particular en el
que tiene lugar el acceso, se denomina condición de competencia.
❑ Para evitar esta condición de competencia se debe asegurar que solo un hilo
a la vez manipule la variable.
❑ Se requiere de una forma de sincronización de los hilos.
❑ Esta situación ocurren frecuentemente en los sistemas operativos, ya que
diferentes partes del sistema manipulan recursos y los cambios no deben
interferir entre ellos.
Operating System Concepts – 9th Edition 5.6 Silberschatz, Galvin and Gagne ©2013
Problema de la sección critica
Operating System Concepts – 9th Edition 5.7 Silberschatz, Galvin and Gagne ©2013
Problema de la sección critica
❑ Un primer método para controlar el acceso a un recurso compartido es declarar
una sección de código como crítica y regular el acceso a dicha sección.
❑ Considere un sistema de n hilos {p0, p1, … pn-1}
❑ Cada hilo tienen un segmento de código denominado sección crítica
❑ Cada hilo puede modificar variables comunes, actualizar tablas, escribir
archivos, etc.
❑ Cuando un hilo esta ejecutando su sección crítica no debe permitir que otros
hilos se ejecuten en esa misma sección.
❑ La ejecución de secciones críticas por hilos es mutuamente exclusiva en el
tiempo.
❑ El problema de la sección crítica consiste en elegir un protocolo que puedan
usar los hilos para cooperar.
Operating System Concepts – 9th Edition 5.8 Silberschatz, Galvin and Gagne ©2013
Problema de la sección critica
❑ Una solución a este problema debe satisfacer los siguientes tres
requerimientos :
➢ Exclusión mutua. Si el hilo T1 se esta ejecutando en su sección crítica,
ningún otro hilo puede estar en la misma ejecución.
➢ Progreso. Si ningún hilo esta ejecutándose en su sección crítica y existen
hilos que desean entrar a sus secciones criticas, entonces solo aquellos
hilos que no se están ejecutando en su sección no critica pueden participar
en la decisión acerca de cual entrara a su sección critica. Esta selección no
puede posponerse de manera indefinida.
➢ Espera limitada. Existe un limite sobre el numero de veces que otros hilos
tienen permitido entrar a su sección crítica después de que un hilo ha hecho
una solicitud para entrar a su sección critica y antes de que se conceda
dicha solicitud. Este limite evita la inanición de cualquier hilo individual.
❑ Cada proceso debe pedir permiso para entrar a la sección critica a través de la
sección de entrada, al terminar debe pasar por la sección de salida y terminar
en la sección final.
Operating System Concepts – 9th Edition 5.9 Silberschatz, Galvin and Gagne ©2013
Sección Critica
❑ Estructura General de un proceso Pi
Operating System Concepts – 9th Edition 5.10 Silberschatz, Galvin and Gagne ©2013
Estados de los Hilos
El método run( )
mueve el hilo de
New a Ejecutable
start()
Asigna memoria para el Nuevo stop( )
Hilo en JVM y llama al método ejecutable Un Hilo termina su método run( )
run() para el objeto del hilo. o llama al método stop( )
new()
crea un objeto nuevo muerto
para el Hilo
sleep()
suspend() resume()
E/S
bloqueado Existen varios Hilos que se ejecutan de manera
asíncrona, manejando tareas a nivel de
Un Hilo queda bloqueado si ejecuta
sistema.
No es posible determinar el estado
exacto de un hilo, aunque el método una sentencia de bloqueo como una ➢ Recolector. Evalúa Objetos para ver si
isAlive() devuelve un valor booleano operación de E/S, o algunos todavía están en uso; si no lo están,
métodos de Thread como sleep( ) o devuelve la memoria al sistema.
que puede usar un proceso para suspend( )
determinar si el hilo está o no en el ➢ Temporizador (timer). Maneja eventos
estado muerto. como llamadas al método sleep( )
➢ Control de gráficos. Oprimir botones,
actualizar pantalla.
Operating System Concepts – 9th Edition 5.11 Silberschatz, Galvin and Gagne ©2013
➢ Esta clase en Java
representa la ejecución
de dos hilos en una
sección critica.
➢ Antes de llamar a su sección ➢ Un hilo NO puede
critica, cada hilo llama al método avanzar, hasta que sea
con el identificador de hilo. capaz de entrar a su
sección critica.
➢ Al terminar su sección critica ➢ La llamada de los
un hilo llama al método métodos en cada hilo se
ejecuta su sección
critica y no critica
Operating System Concepts – 9th Edition 5.12 Silberschatz, Galvin and Gagne ©2013
Algoritmos Sección Critica
Operating System Concepts – 9th Edition 5.13 Silberschatz, Galvin and Gagne ©2013
Algoritmo 1
do {
while (turn == i);
critical section
turn = i;
remainder section
} while (true);
Los hilos comparten una variable entera turn, con valor inicial 1 o 0.
Si turn = i entonces el hilo Ti se le permite ejecutar su sección critica.
Operating System Concepts – 9th Edition 5.14 Silberschatz, Galvin and Gagne ©2013
Algoritmo 1
Los hilos comparten una variable entera turn, con valor incial 1 o 0.
Si turn = i entonces el hilo Ti se le permite ejecutar su sección critica.
yield() Mantiene el hilo en ejecución, pero permite a la JVM seleccionar otro hilo ejecutable
de igual prioridad para su ejecución.
Operating System Concepts – 9th Edition 5.15 Silberschatz, Galvin and Gagne ©2013
Algoritmo 2
do {
flag[i] = true;
turn = j;
while (flag[j] = = true);
critical section
flag[i] = false;
remainder section
} while (true);
* Se sustituye turn por flag[ ], se inicializa con false.
* Si flag[i] = true indica que el hilo Ti esta listo para entrar a su sección critica.
Operating System Concepts – 9th Edition 5.16 Silberschatz, Galvin and Gagne ©2013
Algoritmo 2
* Se sustituye turn por flag[ ], se inicializa con false.
* Si flag[i] = true indica que el hilo Ti esta listo para entrar a su sección critica.
Operating System Concepts – 9th Edition 5.17 Silberschatz, Galvin and Gagne ©2013
Algoritmo 3
do {
flag[i] = true;
turn = j;
while (flag[j] && turn = = j);
critical section
flag[i] = false;
remainder section
} while (true);
❑ Se combinan los Algoritmos 1 y 2.
❑ Obtiene una solución correcta al problema de la sección critica, ya que se
cumplen los tres requerimientos.
❑ Los hilos comparten dos variables:
❑ boolean[ ] flag = new boolean[2];
❑ int turn
❑ Cada elemento del arreglo se inicializa en false, y la variable turn en 0 o 1.
Operating System Concepts – 9th Edition 5.18 Silberschatz, Galvin and Gagne ©2013
Operating System Concepts – 9th Edition 5.19 Silberschatz, Galvin and Gagne ©2013
Semáforos
Operating System Concepts – 9th Edition 5.20 Silberschatz, Galvin and Gagne ©2013
Semáforo
❑ Es una herramienta de sincronización que proporciona una solución más
completa para que los procesos se sincronicen.
❑ Un semáforo S es una variable entera.
❑ Solo puede accederse a través de dos operaciones indivisibles estándar
❑ wait() y signal()
❑ Originalmente conocidas como P(proberen) prueba y
V(verhogen) incrementar.
❑ Definición de la operación wait()[P]
wait(S) {
while (S <= 0); // espera-prueba
S--;
}
❑ Definición de la operación signal() [V]
signal(S) {
S++;
}
Operating System Concepts – 9th Edition 5.21 Silberschatz, Galvin and Gagne ©2013
Semáforo
❖ Las modificaciones al valor entero del semáforo en las operaciones wait()
y signal() se deben ejecutar de manera indivisible.
❖ Cuando un Hilo modifica el valor del semáforo, ningún otro hilo puede
modificar simultáneamente ese mismo valor.
❖ En el caso de wait( S ) la prueba del valor entero y su modificación debe
ejecutarse sin interrupción.
Operating System Concepts – 9th Edition 5.22 Silberschatz, Galvin and Gagne ©2013
Uso de Semáforo
❑ Semáforo de conteo – Valor entero que puede encontrarse dentro
de un dominio sin restricciones
❑ Semáforo Binario – Valor entero que solo puede estar entre 1 y 0
➢ Igual que un mutex lock
❑ Se pueden resolver varios problemas de sincronización
❑ Considere P1 y P2 requieren que S1 se ejecute antes de S2
❑ Crear un semáforo “synch” inicializado a 0
P1:
S1;
signal(synch);
P2:
wait(synch);
S2;
Se puede implementar un semáforo de conteo S como un semáforo
binario.
Operating System Concepts – 9th Edition 5.23 Silberschatz, Galvin and Gagne ©2013
Uso de Semáforo
❖ El uso de un semáforo binario para controlar el acceso a una
sección critica es como sigue (suponga que el semáforo se
inicializa en 1)
Semaforo S
wait(S);
SeccionCritica();
signal(S);
Operating System Concepts – 9th Edition 5.24 Silberschatz, Galvin and Gagne ©2013
Implementación de Semáforo
Operating System Concepts – 9th Edition 5.25 Silberschatz, Galvin and Gagne ©2013
Operating System Concepts – 9th Edition 5.26 Silberschatz, Galvin and Gagne ©2013
Operating System Concepts – 9th Edition 5.27 Silberschatz, Galvin and Gagne ©2013
Operating System Concepts – 9th Edition 5.28 Silberschatz, Galvin and Gagne ©2013
Operating System Concepts – 9th Edition 5.29 Silberschatz, Galvin and Gagne ©2013
Operating System Concepts – 9th Edition 5.30 Silberschatz, Galvin and Gagne ©2013
Operating System Concepts – 9th Edition 5.31 Silberschatz, Galvin and Gagne ©2013
Operating System Concepts – 9th Edition 5.32 Silberschatz, Galvin and Gagne ©2013
Implementación de Semáforo
❑ Se debe garantizar que solo un proceso ejecute wait() y signal() en el
mismo semáforo al mismo tiempo.
❑ La implementación se convierte en el problema de la sección critica donde
los códigos de wait( ) y signal( ) son parte de la sección critica.
➢ Se tiene una espera ocupada en la implementación de la sección
critica
El código debe ser más corto
La espera puede ser corta si la sección critica no esta ocupada
normalmente
❑ Puede darse el caso que una aplicación pase mucho tiempo en la sección
critica, de esta forma la espera sería muy larga y no seria una buena
solución.
Operating System Concepts – 9th Edition 5.33 Silberschatz, Galvin and Gagne ©2013
Implementación de Semáforo
❑ Espera ocupada se requiere para cualquier implementación de un semáforo.
❑ Mientras que un proceso está en su sección crítica, cualquier otro proceso que
intente entrar a la sección crítica debe dar vueltas continuamente en el código
de entrada.
❑ La espera ocupada desperdicia ciclos de CPU.
❑ El semáforo con espera ocupada se conoce como cerradura con vuelta (spinlock)
el proceso “gira” (spin) mientras espera la cerradura (lock).
❑ Los spinlock son útiles en sistemas multiprocesador.
❑ No requiere conmutación de contexto.
❑ Cuando se espera que se retengan cerraduras por tiempos breves, las cerraduras
con vueltas son útiles.
Operating System Concepts – 9th Edition 5.34 Silberschatz, Galvin and Gagne ©2013
Productor – Consumidor
con Hilos y Semáforos
Operating System Concepts – 9th Edition Silberschatz, Galvin and Gagne ©2013
Productor – Consumidor 1
Sin Semáforo
Operating System Concepts – 9th Edition 5.36 Silberschatz, Galvin and Gagne ©2013
Productor – Consumidor 1
Sin Semáforo
Operating System Concepts – 9th Edition 5.37 Silberschatz, Galvin and Gagne ©2013
Productor – Consumidor 2
1 Semáforo Binario
Operating System Concepts – 9th Edition 5.38 Silberschatz, Galvin and Gagne ©2013
Productor – Consumidor 2
1 Semáforo Binario
Operating System Concepts – 9th Edition 5.39 Silberschatz, Galvin and Gagne ©2013
Productor – Consumidor 3
1 Semáforo Binario
1 Semáforo de Conteo
Operating System Concepts – 9th Edition 5.40 Silberschatz, Galvin and Gagne ©2013
Productor – Consumidor 3
1 Semáforo Binario
1 Semáforo de Conteo
Operating System Concepts – 9th Edition 5.41 Silberschatz, Galvin and Gagne ©2013
Productor – Consumidor 4
2 Semáforos Binarios
1 Semáforo de Conteo
Operating System Concepts – 9th Edition 5.42 Silberschatz, Galvin and Gagne ©2013
Productor – Consumidor 4
2 Semáforos Binarios
1 Semáforo de Conteo
Operating System Concepts – 9th Edition 5.43 Silberschatz, Galvin and Gagne ©2013
Problema de los Filósofos Comensales
❑ Considere a cinco filósofos que pasan sus vidas pensando y comiendo.
❑ Los filósofos comparten una mesa redonda común con cinco sillas, una para
cada filósofo.
❑ En el centro de la mesa hay un tazón de arroz, y la mesa está puesta con
cinco palillos chinos únicos para comer (como se muestra en el diagrama).
Operating System Concepts – 9th Edition 5.44 Silberschatz, Galvin and Gagne ©2013
Problema de los Filósofos Comensales
❑ Cuando un filósofo piensa, no interactúa con sus colegas.
❑ De vez en cuando a un filósofo le da hambre y trata de tomar los 2 palillos que
están más cercanos a él (el de su izquierda y su derecha).
❑ Un filósofo puede tomar un solo palillo a la vez, es decir, primero un palillo y
luego el otro (no puede tomar los dos palillos al mismo tiempo). Obviamente
no puede tomar un palillo que ya se encuentre en la mano de su vecino.
❑ Cuando un filósofo con hambre tiene los 2 palillos, come un tiempo aleatorio
sin soltar los palillos. Cuando ha terminado de comer, deja los dos palillos
(primero uno y luego el otro) y comienza a pensar nuevamente.
❑ El arroz es infinito y pueden estar comiendo varios filósofos al mismo tiempo.
Es importante asignarle una clave de identificación a cada filósofo.4
❑ Nota importante: Una vez que un filósofo tomó un palillo no lo suelta hasta que
come.
Operating System Concepts – 9th Edition 5.45 Silberschatz, Galvin and Gagne ©2013
Problema de los Filósofos Comensales
NOTAS de implementación:
1. Comentar su código.
2. IMPRIMIR CADA ACCIÓN que esté realizando su programa (indicando el
filósofo que es, el palillo que está tratando de tomar, si está comiendo, si está
pensando, etc.)
3. No se permite que un hilo sea parámetro(argumento) de otro hilo.
4. Utilice la estructura de la clase Semaphore vista en clase.
Operating System Concepts – 9th Edition 5.46 Silberschatz, Galvin and Gagne ©2013
End of Chapter 5
Operating System Concepts – 9th Edition Silberschatz, Galvin and Gagne ©2013