Mecanismos de Sincronización (SEMÁFOROS VS MONITORES) Franco Hernán Chalán Gualán Carrera de Ingeniería en Sistemas, Universidad Nacional de Loja Loja, Ecuador {
[email protected] }
— El Abst Abstract ract El
presente trabajo corresponde al informe sobre los mecanismos de sincronización como son los SEMAFOROS y MONITORES los mismos que son muy importantes en el desarrollo de aplicaciones, sistemas operativos, entre otros.
P alabras alabras
claves:
Mecanismos de Sincronización, desarrollo de aplicaciones, Semáforos, Monitores, Hilos, Procesos, Sección Crítica, granularidad.
I.
INTRODUCCIÓN
Este documento contiene una descripción clara acerca de los mecanismos de sincronización. Para realizar el estudio de este tema se debe conocer acerca de los procesos, Definición de hilos de ejecución o threads, las diferencias entre procesos e hilos de ejecución. En el presente documento veremos acerca de las ventajas desventajas, sincronización de procesos, estableciendo su definición de cada una de ellas, características, tipos, sintaxis y sus respectivos ejemplo de cada mecanismo de sincronización que veremos, también veremos algo sobre la sección critica, así como la descripción detallada de algunos de los principales modelos de sincronización tales como el de exclusión mutua (mutex). El SO ofrece mecanismos básicos de comunicación, que permiten transferir cadenas de bytes. Deben ser los procesos que se comunican quienes interpreten el significado de las cadenas transferidas para su labor coordinada. Los mecanismos de comunicación y sincronización son dinámicos. Es decir, cuando se necesita un mecanismo de este estilo, se crea, usa y destruye, de forma que no se establezca de forma definitiva ningún mecanismo de comunicación, ya que ellos podrían producir efectos indeseados. Es decir, la comunicación es algo puntual. Los servicios básicos de comunicación son: a.
b. enviar o escribir: el proceso emisor envía información al proceso receptor c. recibir o leer: el proceso receptor recibe información d. destruir: el proceso solicita la destrucción del mecanismo de comunicación
crear: el proceso solicita la creación del mecanismo
La comunicación puede ser síncrona y asíncrona: a síncrona: a.
síncrona: los dos procesos han de ejecutar servicios de forma simultánea. El emisor ha de ejecutar el servicio enviar mientras el receptor ejecuta recibir. b. asíncrona: el emisor hace el envío y prosigue su ejecución. El SO ofrece un almacenamiento intermedio para guardar la información enviada, hasta que el receptor la solicite. En programación concurrente, se define como a la porción de código de un programa de computador el cual accede a un recurso compartido (estructura de datos ó dispositivo) que no debe de ser accedido por mas de un hilo en ejecución (thread). La sección crítica por lo general termina en un tiempo determinado y el hilo, proceso ó tarea solo tendrá que esperar un período determinado de tiempo para entrar. Se necesita de un mecanismo de sincronización en la entrada y salida de la sección crítica para asegurar la utilización exclusiva del recurso, por ejemplo los SEMÁFOROS y MONITORES.
II.
SEMÁFOROS
Un semáforo es un mecanismo de sincronización que se utiliza generalmente en sistemas con memoria compartida, bien sea un monoprocesador o un multiprocesador. Los semáforos son un mecanismo de sincronización de procesos inventados por Edsger Dijkstra en 1965. Los semáforos permiten al programador asistir al planificador del sistema operativo en su toma de decisiones de manera que permiten sincronizar la ejecución de dos o más procesos. A diferencia de los cerrojos, los semáforos nos ofrecen un mecanismo de espera no ocupada.
Los semáforos son un tipo de datos que están compuestos por dos atributos:
Un contador, que siempre vale >= 0. Una lista de procesos (lista formada por el PCB de cada proceso), inicialmente vacía.
Y disponen de dos operaciones básicas que pasamos a describir en pseudocódigo:
Wait (Down) Signal (Up)
Un semáforo es un objeto con un valor entero al que se le puede asignar un valor inicial no negativo y al que sólo se puede acceder utilizando dos operaciones atómicas:
Un tipo simple de semáforo es el binario, que puede tomar solamente los valores 0 y 1. Se inicializan en 1 y son usados cuando sólo un proceso puede acceder a un recurso a la vez. Son esencialmente lo mismo que los mutex. Cuando el recurso está disponible, un proceso accede y decrementa el valor del semáforo con la operación P. El valor queda entonces en 0, lo que hace que si otro proceso intenta decrementarlo tenga que esperar. Cuando el proceso que decrementó el semáforo realiza una operación V , algún proceso que estaba esperando comienza a utilizar el recurso. Para hacer que dos procesos se ejecuten en una secuencia predeterminada puede usarse un semáforo inicializado en 0. El proceso que debe ejecutar primero en la secuencia realiza la operación V sobre el semáforo antes del código que debe ser ejecutado después del otro proceso. Éste ejecuta la operación P . Si el segundo proceso en la secuencia es programado para ejecutar antes que el otro, al hacer P dormirá hasta que el primer proceso de la secuencia pase por su operación V . Este modo de uso se denomina señalación ( signaling ), y se usa para que un proceso o hilo de ejecución le haga saber a otro que algo ha sucedido.
EJEMPLO DE USO DE SEMÁFOROS Nótese que siempre que queramos forzar una transición de un proceso a estado bloqueado, tenemos que hacer que dicho proceso realice una operación down sobre un semáforo cuyo contador vale cero.
Suponga el siguiente ejemplo en el que se quieren sincronizar dos hilos de un proceso, de manera que se dé la siguiente secuencia de ejecución: A, B, A, B,... y así sucesivamente. El siguiente código resolvería el problema:
Nótese que una operación up sobre un semáforo en el que hay procesos en su lista resulta en que se retire uno de los procesos (el que más tiempo lleva en la lista), realizando éste la transición ha estado preparado. Es un error frecuente pensar que una operación up resulte en que el proceso retirado de la lista pase a estado activo. Recuerde que las transiciones de estado activo a preparado y viceversa son siempre controladas por el planificador del sistema operativo.
APLICACIONES Los semáforos se emplean para permitir el acceso a diferentes partes de programas (llamados secciones críticas) donde se manipulan variables o recursos que deben ser accedidos de forma especial. Según el valor con que son inicializados se permiten a más o menos procesos utilizar el recurso de forma simultánea.
TIPOS DE SEMÁFOROS Dependiendo de la función que cumple el semáforo, vamos a diferenciar los siguientes tipos:
Semáforo de exclusión mutua, inicialmente su contador vale 1 y permite que haya un único proceso simultáneamente dentro de la sección crítica.
Semáforo contador, permiten llevar la cuenta del número de unidades de recurso compartido disponible, que va desde 0 hasta N. Semáforo de espera, generalmente se emplea para forzar que un proceso pase a estado bloqueado hasta que se cumpla la condición que le permite ejecutarse. Por lo general, el contador vale 0 inicialmente, no obstante, podría tener un valor distinto de cero.
VENTAJAS
Permiten sincronizar dos o más procesos de manera que no se desperdician recursos de CPU realizando comprobaciones continuadas de la condición que permite progresar al proceso. Pueden imponer restricciones que ayudan a los programadores a evitar errores. Las soluciones suelen ser limpias y organizadas haciendo fácil demostrar su corrección. Pueden implementarse de manera eficiente en muchos sistemas, las soluciones que los usan son portables y eficientes.
DESVENTAJAS
III.
Los monitores son objetos destinados a ser usados sin peligro por más de un hilo de ejecución. La característica que principalmente los define es que sus métodos son ejecutados con exclusión mutua. Lo que significa, que en cada momento en el tiempo, un hilo como máximo puede estar ejecutando cualquiera de sus métodos. Esta exclusión mutua simplifica el razonamiento de implementar monitores en lugar de código a ser ejecutado en paralelo. En el estudio y uso de los semáforos se puede ver que las llamadas a las funciones necesarias para utilizarlos quedan repartidas en el código del programa, haciendo difícil corregir errores y asegurar el buen funcionamiento de los algoritmos. Para evitar estos inconvenientes se desarrollaron los monitores.
CARACTERISTICAS Un monitor es una estructura del lenguaje cuyas principales características son:
Los programadores tienden a usarlos incorrectamente, de manera que no resuelven de manera adecuada el problema de concurrencia o dan lugar a interbloqueos. No hay nada que obligue a los programadores a usarlos. Los compiladores no ofrecen ningún mecanismo de comprobación sobre el correcto uso de los semáforos. Son independientes del recurso compartido al que se asocian.
Debido a las desventajas que traen los semáforos de crearon los monitores.
GRANULARIDAD Número de recursos controlados por cada semáforo. Hay de dos tipos:
Granularidad fina: Un recurso por semáforo. Hay un mayor grado de paralelismo, lo que puede mejorar la rapidez de ejecución de la protección. Aunque a mayor número de semáforos existe una mayor probabilidad de que se dé un interbloqueo entre semáforos, que no sería una mejora de lo que intentamos evitar. Granularidad gruesa: Un semáforo para todos los recursos. Caso totalmente inverso al anterior: Ahora al tener un semáforo no se produce interbloqueo entre ellos, aunque los tiempos de ejecución son excesivamente largos.
MONITORES
Los datos son privados. Ofrecen una serie de métodos públicos para acceder a dichos datos. En cada momento sólo puede haber un proceso activo en algún método del monitor, es decir, ejecutando código de esos métodos públicos del monitor. Sería equivalente a decir que el recurso que queremos compartir se declara como monitor. Los procesos que usan el monitor son independientes unos de otros y cuando deseen usar el recurso, llamarán a los métodos del monitor que implementen la operación que se desea ejecutar.
Permiten organizar procesos en espera mediante:
Variables de condición: lista de procesos inicialmente vacía. Primitivas: wait(c), añade el proceso p invocante a c y proceso p bloquea; signal(c), selecciona a uno de los procesos en c y lo pone en preparado.
COMPONENTES Un monitor tiene cuatro componentes: inicialización, datos privados, métodos del monitor y cola de entrada.
Inicialización: contiene el código a ser ejecutado cuando el monitor es creado Datos privados: contiene los procedimientos privados, que sólo pueden ser usados desde dentro del monitor y no son visibles desde fuera Métodos del monitor: son los procedimientos que pueden ser llamados desde fuera del monitor. Cola de entrada: contiene a los hilos que han llamado a algún método del monitor pero no han podido adquirir permiso para ejecutarlos aún.
EJEMPLO DEL FUNCIONAMIENTO DE UN MONITOR Dado un cierto recurso compartido protegido por una clase monitor denominada RecursoCompartido con los siguientes métodos:
get, permite obtener el valor del recurso compartido, devuelve un entero. set, permite establecer el valor del recurso compartido.
Suponga ya creada un objeto RecursoCompartido para dos hilos h1 y h2: RecursoCompartido r = new RecursoCompartido();
Como vemos, los monitores se implementan con semáforos, son una abstracción de los mismos.
Donde r llamara a los métodos set y get para establecer y obtener el valor del recurso compartido Dichos hilos tienen el siguiente código:
TIPOS DE MONITORES
Tipo Hoare: En la definición original de Hoare, el thread que ejecuta cond_signal le cede el monitor al thread que esperaba. El monitor toma entonces el lock y se lo entrega al thread durmiente, que reanuda la ejecución. Más tarde cuando el monitor quede libre nuevamente el thread que cedió el lock volverá a ejecutar. Tipo Mesa: Los monitores del tipo Mesa son menos propensos a errores, ya que un thread podría hacer una llamada incorrecta a cond_signal o a cond_broadcast sin afectar al thread en espera, que verificará la condición y seguirá durmiendo si no fuera la esperada.
Lector (h1):
int valor; for(int j=0; j<2; j++) { valor=r.get(); print(valor); }
#1 #2 #3
Escritor (h2):
int i=0; for(int j=0; j<2; j++) { r.set(i); i++; }
#1 #2 #3
SINTAXIX monitor monitor-nombre{ //declaracion variables compartidas procedure P1 (…) { … } … procedure Pn (…) {……} //Código inicialización Initialization code ( …) { … } … }
El tipo de dato "Monitor" contiene la declaración de variables compartidas cuyos valores definen el estado de una instancia de dicho tipo. Tiene un cuerpo de procedimientos o funciones que operan dichas variables. La representación de un tipo Monitor no puede ser utilizada directamente por los distintos procesos, es por eso que dentro de un Monitor sólo se puede acceder a variables locales y a sus parámetros formales.
VENTAJAS
Exclusión mutua automática: Al ejecutar un “wait” (dormir) al proceso que está dentro del monitor, inmediatamente se permite que entre otro proceso que esté en la cola esperando a entrar. Ejecución simultánea o concurrencia modular: Evitando conflictos de compartición de recursos al existir exclusión mutua. Modularidad: Sólo en el Monitor se tiene visibilidad sobre los objetos que están declarados en él. Encapsulamiento o abstracción: Su estructura encierra variables compartidas o recursos, es decir, que no se les permite entrar directamente a estructuras internas del Monitor desde procedimientos que hayan sido declarados externos a éste.
Facilidad de mantención: La sincronización de procesos se realiza en el interior del Monitor, por lo que es más fácil de verificar, y por ende se facilita su mantenimiento. Ventajas comparando con estructuras de bajo nivel:
Construcción de alto nivel : Donde hablamos de Modularidad. Exclusión mutua automática: En este caso también podemos mencionarla.
V.
REFERENCIAS
[1] Universidad de Sevilla (2016) Sistemas Operativos https://1984.lsi.us.es/wikissoo/index.php/Sem%C3%A1foros [2] Wikipedia (2017) Semáforo https://es.wikipedia.org/wiki/Sem%C3%A1foro_(inform %C3%A1tica) [3] Adriana Mora (2016) Semáforos https://prezi.com/7lahlvrw2pgn/semaforos/
DESVENTAJAS
Sincronización depende del programador: Razón por la cual existe la probabilidad de errores. Riesgo de deadlock, (Inter Bloqueo) : Situación en la que se produce interbloqueo es cuando dos procesos están bloqueados en un receive() y esperan un mensaje que nunca les va a llegar. Probabilidades de starvation: Es decir, que se tengan procesos de baja prioridad que nunca lleguen a ejecutarse. Muy costoso: Al bloquearse muchos procesos, se produce una pérdida de eficiencia. Riesgo de thrashing o hiperpaginación: sucede cuando se utiliza una gran cantidad de recursos de manera creciente para hacer una cantidad cada vez más baja de trabajo. Generalmente se refiere a cuando se cargan y descargan constantemente partes de la imagen de un proceso desde y hacia la Memoria Principal y la Memoria Virtual o espacio de intercambio. IV.
CONCLUSIONES
Los SEMÁFOROS y MONITORES son mecanismos de sincronización las cuales no ayudan a mejorar el desarrollo de aplicaciones en cualquier lenguaje de programación, para reducir el consumo de recursos al momento de ejecutarlos. Los MONITORES fueron creados a causa de que los SEMÁFOROS no podían resolver todos los problemas que se dan en la sincronización de procesos y por lo que son independientes de los recursos compartidos Con la realización del presente trabajo se estudió acerca de los mecanismos de sincronización, cuales son las ventajas y desventajas de los mismos y su sintaxis. De igual forma se sabrá qué mecanismos de sincronización se debe utilizar al momento de realizar aplicaciones informáticas.
[4] Administración de Sistemas Distribuidos (2014) https://administraciondesd.jimdo.com/%C3%ADndice/si ncronizaci%C3%B3n-y-coordinaci%C3%B3n-en-unentorno-distribuido/mecanismo-desincronizaci%C3%B3n-entre-procesos/ [5] Wikipedia (2016) Monitores https://es.wikipedia.org/wiki/Monitor_(concurrencia) [6] Universidad de Sevilla (2016) Monitores https://1984.lsi.us.es/wiki-ssoo/index.php/Monitores [7] Wikiinfo (2012) Monitores http://wiki.inf.utfsm.cl/index.php?title=Monitores [8] Pita Fernández Miguel (2015) Sincronización entre Procesos. http://www.monografias.com/trabajos51/sincrocomunicacion/sincro-comunicacion2.shtml