Está en la página 1de 69

Sincronización de Procesos

Capitulo 9 - Sistemas Operativos


Autor (es): Dhananjay M. Dhamdhere
Introducción
 Los procesos interactivos con el fin de cumplir una meta en
común, necesitan compartir datos o coordinar actividades
entre sí. La sincronización para acceder a datos garantiza
que aquellos que se comparten no pierdan consistencia
cuando son actualizados por varios procesos.

 Esto se realiza asegurándose de que los accesos a datos


compartidos sean efectuados de manera mutuamente
exclusiva.

 Los sistemas de cómputo proporcionan instrucciones


indivisibles(también llamadas instrucciones atómicas) para
apoyar el acceso a datos y la sincronización de controles.
Sincronización de Acceso a Datos
 Las condiciones de ejecución surgen si varios procesos
acceden a datos compartidos sin que exista coordinación.
Las condiciones de ejecución no son reproducible y, por
ende, la depuración es difícil.

 Se usa la sincronización de acceso a datos para acceder a


datos compartidos de manera mutuamente exclusiva. Esto
evita las condiciones de ejecución y salvaguarda la
consistencia de los datos compartidos.
Sincronización de Controles

 La sincronización de controles es necesaria si un proceso


ejecuta alguna acción ai, sólo después de que algunos otros
procesos han ejecutado una serie de acciones {aj} o sólo
cuando se tiene una serie de condiciones {ck}.
Implementando la Sincronización
 La técnica básica que se usa para realizar la sincronización
consiste en bloquear un proceso hasta que una acción
apropiada es ejecutada por otro, o hasta que se cumpla una
condición.

 Así, la sincronización de acceso a datos se realiza


bloqueando un proceso hasta que el otro termina su acceso
a los datos compartidos.

 La sincronización de controles se realiza bloqueando un


proceso hasta que otro efectúe una acción específica.
Secciones Críticas
 Una sección crítica (SC) para un ítem de dato ds, es una
sección de código que no debe ser ejecutada consigo misma
ni con otras secciones críticas para ds.

 Si algún proceso Pi, está ejecutando una sección crítica para


ds, otro proceso que desea ejecutar una sección crítica para
ds, tendrá que esperar hasta que Pi termine la ejecución de
su sección crítica.

 De este modo, una SC para un ítem de dato ds, es una


región de exclusión mutua con respecto a los accesos a ds; a
lo sumo, un proceso puede ejecutar una SC para ds en
cualquier momento.
Secciones Críticas
 Las condiciones de ejecución en un ítem de dato se evitan
cuando se realizan todas sus operaciones de actualización
dentro de una SC para el ítem de dato. Además, para
asegurar que los procesos vean valores consistentes de un
ítem de dato, todos sus usos también deberán ocurrir dentro
de una SC para el ítem de dato.

 Señalamos una SC en una parte de código mediante un


recuadro de líneas discontinuas. Observe que los procesos
podrán compartir una sola copia de código.
Secciones Críticas
 En este caso, una sola SC para ds, podrá existir una
aplicación. En forma alternativa, el código para cada proceso
podrá contener una o varias SC para ds.

 De un proceso que ejecuta una SC se dice que esta en una


SC. También usamos los términos “entrar en una SC” y “salir
de una SC” para situaciones donde un proceso inicia y
termina la ejecución de una SC, respectivamente.
Secciones Críticas

 La figura muestra un proceso que tiene varias SC. Éstas se


podrán usar para acceder a los mismos o a distintos ítems de
datos compartidos. De este modo un proceso podrá contener
varias SC para el mismo ítem de dato.
Secciones Críticas
 La ausencia de condiciones de ejecución se puede mostrar
de la siguiente manera:

 Partiendo de la definición de SC, se deduce que solo uno de


ellos puede ejecutar su SC en cualquier momento dado, así
que el valor resultando de nextseatno será fi(fj(nextseatno)) o
fj(fi(nextseatno))
Propiedades de una implementación de una SC
 Una implementación de SC para un ítem de dato ds, es como
un planificador para un recurso.

 Debe estar al corriente de todos los procesos que quieren


entrar a una SC para ds y debe seleccionar un proceso para
la entrada en una SC de acuerdo con las nociones de
exclusión mutua, eficiencia e imparcialidad.

 La exclusión mutua garantiza que no habrá mapas de un


proceso en una SC para ds en un momento dado.
Propiedades esenciales de una implementación de SC
Propiedad Descripción

Corrección En cualquier momento dado, a lo sumo un proceso


podrá ejecutar una SC para un ítem de dato ds.

Cuando una SC no está en uso, uno de los procesos que


Progreso desean entrar en ella recibirá permiso de entrar en la
SC.

Después de que un proceso Pi haya indicado su deseo


Espera de entrar en una SC para ds, la cantidad de veces que
Limitada otros procesos puedan obtener la entrada en un SC
para ds antes de Pi está limitada por un número entero
finito.
El problema de Espera Activa
 Un proceso puede implementar una SC para un ítem de dato
ds usando el siguiente código sencillo:

 En el bucle mientras, el proceso revisa si algún otro proceso


está en una SC para el mismo ítem de dato.
Condiciones de Ejecución en la Sincronización de
Controles
 Los procesos usan la sincronización de controles para
coordinar sus actividades entre sí. Un requerimiento
frecuente en la sincronización de procesos es que un
proceso Pi deberá ejecutar una acción ai solo después de
que el proceso Pj haya ejecutado una acción aj.

Pseudocódigo de este tipo de procesos.


Señalización
 Señalización por variables booleanas
Señalización
 La figura mostrada en la diapositiva anterior muestra como
se realiza la señalización. Los datos de Sincronización
consisten en dos variables booleanas. La variable
action_aj_performed es una señal para indicar si el proceso
Pj ha ejecutado la acción aj.

 La variable pi_blocked es una señal para indicar si el proceso


Pi se ha bloqueado a si mismo en espera de la ejecución de
la acción aj por parte del proceso Pj.
Condiciones de Ejecución en la Señalización de
Procesos
 Según la grafica considere las instrucciones if en los
procesos Pi y Pj como las operaciones fi y fj en el estado del
sistema. El resultado de su ejecución deberá ser uno de los
siguientes: el proceso Pi se bloquea a si mismo, es activado
por Pj y ejecuta la acción ai. Sin embargo Pi se bloquea a si
mismo y no es activado.
Operación Indivisible
 Una operación indivisible es un conjunto de ítems de datos
{ds} es una operación que no se puede ejecutar en forma
concurrente con cualquier otra operación que involucra un
ítem de dato incluido en {ds}.
Implementación de Secciones Críticas y
Operaciones indivisibles
 La sincronización de procesos requiere secciones críticas u
operaciones de señalización que son indivisibles. Éstas se
realizan usando instrucciones indivisibles proporcionadas por
sistemas de computo, así como variables de bloqueo.
Implementación de Secciones Críticas y
Operaciones indivisibles
 Instrucciones Indivisibles:

Si un sistema de cómputo contiene más de un CPU, pueden


presentarse condiciones de ejecución incluso durante la
ejecución de una sola instrucción que toma más de un
acceso a una ubicación de memoria; por ejemplo, una
instrucción que incrementa el valor de una variable.
Implementación de Secciones Críticas y
Operaciones indivisibles
 Uso de una variable de bloqueo:

Se usa para puentear el espacio entre secciones críticas u


operaciones indivisibles y las instrucciones indivisibles
proporcionadas en un sistema de cómputo.

La idea básica es poner un cerrojo al inicio de una sección


crítica o de una operación indivisible, y abrirlo al final de la
sección crítica o de la operación indivisible.
Implementación de Secciones Críticas y
Operaciones indivisibles
 Uso de una instrucción indivisible para realizar una
instrucción crítica:
Problemas clásicos de la Sincronización de Procesos
 La solución para un proceso de sincronización de procesos
deberá usar una combinación adecuada de estos elementos.
También deberá poseer tres propiedades importantes:

1. Corrección
2. Máxima Concurrencia
3. No existencia de Esperas Activas

 Los criterios de corrección dependen de la naturaleza de un


problema. Éstos proyectan requerimientos referentes a la
sincronización de accesos a datos y a la sincronización de
controles de procesos interactivos.
Productores/Consumidores con buffers acotados
 Consiste en un numero no especifico de procesos
productores y consumidores, así como un área central de
memoria finita para buffers.

 Cada buffer es capaz de contener un registro de información;


se dice que está lleno cuando un productor graba en el, y
vacio cuando un productor copia u registro contenido en él;
en un inicio el buffer esta vacio.
Productores/Consumidores con buffers acotados

 Productores y Consumidores
Productores/Consumidores con buffers acotados
 Un sistema de productores/consumidores con buffers
acotados es una abstracción de muchos problemas prácticos
de sincronización.
 Una Solución para el problema de productores/consumidores
debe cumplir con las siguientes condiciones:
1. Un productor de debe sobre escribir en un buffer lleno.
2. Un consumidor no debe consumir de un buffer vacio.
3. Productores y Consumidores deben acceder a buffers
de manera mutuamente exclusiva.
4. Las informaciones deben consumirse en el mismo
orden aplicado para colocar en los buffers, es decir, en
orden FIFO.
Lectores y Escritores
 Un sistema de lectores/escritores consiste en una serie de
procesos que usan algunos datos compartidos.

 Un proceso que solo lee datos es un lector; uno que los


modifica o actualiza es el escritor.

 Usamos términos de lectura y escritura para referirnos a


accesos a los datos compartidos realizados por procesos de
lectores y escritores, respectivamente.
Lectores y Escritores
 Las condiciones de corrección para el problema de
lectores/escritores son las siguientes:

1. Muchos lectores pueden realizar la lectura en forma


concurrente.
2. La lectura esta prohibida mientras un lector escribe.
3. Sólo un lector puede realizar escritura en cualquier
momento dado.
4. Un lector tiene una prioridad no preferente sobre
escritores, es decir, obtendrá acceso a los datos
compartidos antes que un escritor en espera, pero no
tendrá preferencia sobre un escritor activo.
Ejemplo de Lectores y Escritores
 Los lectores y escritores comparten una cuenta bancaria. Los
procesos de lectores print statement y stat analysis
únicamente leen los datos de la cuenta bancaria; por ende,
pueden ejecutar en forma concurrente.
Estructura de Sistemas Concurrentes
 Un sistema concurrente es aquel que contiene procesos
concurrentes; tiene tres componentes clave:
1. Datos compartidos.
2. Operaciones con datos compartidos.
3. Procesos

 Los datos compartidos pueden ser de dos tipos: datos


usados y manipulados por procesos y datos definidos y
usados para la sincronización de procesos.

 Una operación de sincronización, es aquella con datos de


sincronización.
Estructura de Sistemas Concurrentes
 Instantánea de un sistema concurrente: Una instantánea
de un sistema concurrente es una vista (fotográfica) del
sistema en un momento específico. Ésta muestra las
relaciones entre datos compartidos, operaciones y procesos
en ese momento.

 Convenciones pictóricas para instantáneas concurrentes


El planteamiento algorítmico para la
implementación de secciones críticas
 Este tipo de planeamiento emplea un ordenamiento de
condiciones lógicas para cumplir con los requerimientos de
sincronización deseados.

 Todos los sistemas que usan el planteamiento algorítmico


para la implementación de SC tiene algunas características y
debilidades comunes.

 Un proceso que desea usar una SC verifica unas cuantas


condiciones para decidir si puede entrar en la SC.
El planteamiento algorítmico para la
implementación de secciones críticas
1. La estructura de control Parbegin-Parend se usa para
encerrar el código que se deberá ejecutar en paralelo. Esta
estructura de control tiene la sintaxis Parbegin <Lista de
Sentencias> Parend. Si <Lista de sentencias> contiene n
instrucciones, la ejecución de la estructura de control
Parbegin-Parend crea n procesos, y cada uno consiste en
la ejecución de una instrucción en <Lista de sentencias>.

Por ejemplo, Parbegin S1, S2, S3, S4 Parend inicia cuatro


procesos que ejecutan S1, S2, S3 y S4 , respectivamente
El planteamiento algorítmico para la
implementación de secciones críticas
2. Las instrucciones de variables compartidas se colocan
antes de un Parbegin.
3. Las instrucciones de variables locales se colocan al
principio de un proceso.
4. Los comentarios están cerrados entre llaves “{ }”.
5. El sangrado se usa para mostrar el anidamiento de las
estructuras de control.

 Empezamos por la discusión de realizaciones de SC para


ser usadas por dos procesos. Posteriormente ampliamos
algunos de estos sistemas para ser usada por n procesos.
Dos algoritmos de Proceso
 ALGORITMO 9.1
Dos algoritmos de Proceso
 ALGORITMO 9.2
Dos algoritmos de Proceso
 ALGORITMO 9.3
Dos algoritmos de Proceso
Algoritmos de n Procesos
Algoritmo Bakery
Semáforos
 Un semáforo es una variable entera compartida con valores
no negativos que sólo pueden estar sujetos a las siguientes
operaciones:

1. Inicialización (especificada como parte de su


declaración).
2. Las operaciones indivisibles wait y signal.
Semáforos
 A continuación se muestra la semántica de operaciones
wait y signal en un semáforo.
Uso de Semáforos en sistemas concurrentes
Exclusión La exclusión mutua puede ser implementada usando un semáforo que es
Mutua inicializado en 1.
Un proceso ejecuta una operación wait en el semáforo antes de entrar en una SC,
y ejecuta una operación signal cuando sale de ella. Un tipo especial de semáforo
llamado semáforo binario simplifica la implementación de SC aún más.

Concurrencia La concurrencia acotada implica que una función puede ser ejecutada
Acotada concurrentemente por n procesos, 1≤n≤c, donde c es una constante.
Un Semáforo inicializado a c puede ser usado para realizar la concurrencia
acotada.

Señalización La señalización se usa cuando un proceso Pi desea realizar una acción a i solo
después de que el proceso Pj haya realizado una acción aj. Se realiza usando un
semáforo inicializado en “0”. Pi realiza un signal en el semáforo después de
realizar la acción aj. Este arreglo asegura que Pi ejecute a i sólo después de que Pj
ejecuta aj.
Semáforos
 A continuación se detalla la implementación de SC
mediante semáforos.
Semáforos
 Instantáneas del sistema concurrente detallado en la
diapositiva anterior:
Semáforos
 Semáforos Binarios: Es una forma especial de semáforo
usada para realizar la exclusión mutua. Por tanto,
frecuentemente se le llama mutex. Este tipo de Semáforo
es inicializado en “1” y solo toma los valores de 0 y 1
durante la ejecución del programa.

 Concurrencia Acotada: Este termino se usa para


referirnos a la situación en la que hasta c procesos pueden
ejecutar en forma concurrente una operación opi, donde c
es una contante ≥ 1.
Semáforos
 En las siguientes líneas de código se muestra cómo una
serie de procesos concurrentes comparte cinco impresoras.
Productores/Consumidores usando semáforos

Señalización Usando Semáforos


Productores/Consumidores usando semáforos
 Productores/Consumidores con un solo buffer
Productores/Consumidores usando semáforos
 Instantáneas de Productores/Consumidores con un solo
buffer usando semáforos:
Productores/Consumidores usando semáforos
 Buffers acotados usando semáforos
Lectores/Escritores usando semáforos
 Características clave del problema de Lectores/escritores:

1. Cualquier número de lectores puede leer en forma


concurrente.
2. Lectores y escritores deben esperar si un escritor esta
escribiendo. Cuando el escritor sale, se deberán activar
todos los lectores en espera o se deberá activar un
lector en espera.
3. Un escritor debe esperar si hay lectores que están
leyendo. Se debe activar cuando el último lector salga.
Lectores/Escritores usando semáforos
 Implementamos estas características manteniendo la
cuenta del número de lectores y escritores que desean leer
o escribir en algún momento dado. Se introducen los
siguientes contadores para este propósito:

1. Runread  conteo de lectores que están actualmente


leyendo.
2. Totread  conteo de lectores esperando para leer o
leyendo concurrentemente.
3. Runwrite  conteo de escritores que están actualmente
escribiendo.
4. Totwrite  conteo de escritores esperando para escribir
o escribiendo concurrentemente.
Lectores/Escritores usando semáforos
 A continuación se muestra el esquema de solución definida
para lectores/escritores sin prioridad de lectores.
Lectores/Escritores usando semáforos
 Implementación de Semáforos:
Lectores/Escritores usando semáforos
 Implementación de Operaciones wait y signal:
Regiones Críticas Condicionadas
 La región crítica condicionada (RCC) es una estructura de
control en un lenguaje de programación de alto nivel.

 FIGURA 9.32 (Programa usan RCC)


Regiones Críticas Condicionadas

 Buffer acotado usando RCC


Monitores
 Un monitor es un constructor de lenguaje de programación
que soporta tanto la sincronización de acceso de datos
como la de controles.

 Un tipo de monitor se parece a una clase en un lenguaje C+


+ o Java. Un programa concurrente crea objetos de monitor,
y los usa para ejecutar operaciones con datos compartidos
y para realizar operaciones de sincronización de procesos.
Aspectos de un Tipo Monitor
Aspecto Descripción

Declaración de Aquí se declaran datos compartidos y variables de condición.


Datos Copias de estos datos existen en cada objeto de un tipo de
monitor.

Inicialización de Se inicializan datos cuando un monitor, es decir, un objeto de un


Datos tipo de monitor, es creado.

Operaciones de Las operaciones con datos compartidos son codificadas como


Datos compartidos procedimientos del tipo de monitor. El monitor
asegura que estas operaciones sean ejecutadas en forma
mutuamente exclusiva.

Operación de Los procedimientos del tipo monitor prefieren el uso de


Sincronización operaciones de sincronización wait y signal sobre variables de
condición para sincronizar la ejecución de procesos.
Monitores
 Implementación de monitor de un semáforo binario
Monitores
 Un monitor realizando un semáforo binario.
Planificador de disco: un caso de estudio
 Los procesos del usuario comparten un discode cabeza
móvil. Se usa un monitor para iniciar operaciones de E/S en
el disco. Un proceso de usuario llama a un procedimiento
del monitor para transmitir los detalles de una operación de
E/S.
1. Datos compartidos: Datos en relación con operaciones
de E/S pendientes.
2. Operaciones con datos compartidos: Se pueden
identificar las siguientes operaciones:
a. Agregar una operación de E/S a una lista I/O_list.
b. Borrar una operación de E/S de una lista I/O_list.
c. Analizar operaciones de E/S en I/O_list y ejecutar
planificación.
Planificador de disco: un caso de estudio
 Un monitor para la implementación del planificador de
discos.
Monitor de Disco
 Toma instantánea del monitor de disco:
Monitores en Java
 Una clase de Java se convierte en un tipo de monitor
cuando el atributo synchronized es asociado con uno o
varios métodos de su clase. Un objeto de una de estas
clases es un monitor.

 La máquina virtual de Java asegura la exclusión mutua por


medio de los métodos synchronized en un monitor. Cada
monitor contiene una sola variable de condición sin nombre.
Sincronización de procesos en Unix
 El sistema V de Unix ofrece la implementación de
semáforos en el nivel de kernel. El kernel realiza las
operaciones de wait y signal y los procesos invocan a estas
operaciones por medio de llamadas al sistema.

 Unix SVR4 ofrece una característica interesante para hacer


más confiables los programas que usan semáforos.
Mantiene pendientes todas las operaciones ejecutadas por
un proceso en cada semáforo que usa, y realiza un
“deshacer” en estas operaciones cuando termina el
proceso.
Sincronización de procesos en Linux
 Linux ofrece un semáforo parecido al de Unix para ser
usado por parte de los procesos de usuario. También ofrece
dos tipos de semáforos para su empleo por parte de un
kernel: uno convencional y uno de lectores/escritores. La
puesta en funcionamiento del semáforo convencional para
el kernel es análoga al esquema de implantación en el nivel
de kernel.

 Para este tipo de SO las operaciones wait y signal emplean


instrucciones indivisibles para reducir e incrementar el valor
del semáforo.
Sincronización de procesos en Windows
 Windows es un sistema orientado a objetos. Todas las
entidades del sistema están representadas por ellos. El
kernel proporciona objetos llamados dispatcher objects para
la sincronización de hilos.

 Cada uno de los objetos que representan procesos,


archivos y eventos implanta un objeto de despachador. De
este modo, estos objetos pueden usarse para la
sincronización de hilos. Mutexes y semáforos también son
representados por objetos.

También podría gustarte