PRÁCTICA : “INTRODUCCIÓN A LOS MONITORES”
Enviado por Hugo Mexes • 17 de Diciembre de 2018 • Informe • 2.178 Palabras (9 Páginas) • 139 Visitas
PRÁCTICA : “INTRODUCCIÓN A LOS MONITORES”
- CONTENIDO
En esta guía de laboratorio se expondrá las primitivas de sincronización conocidas como monitores.
- OBJETIVOS ESPECÍFICOS
- Conocer el funcionamiento de los monitores.
- Analizar las diferentes aplicaciones que tienen los monitores en la programación concurrente.
- MATERIAL Y EQUIPO
- Práctica : Introducción a los monitores.
- Apuntes de las sesiones teóricas (Capítulo 5).
- Libro “Principios y algoritmos de concurrencia” de Ricardo Galli.
- Un computador con Eclipse Gavab (Pascal FC incluido) instalado.
- FUNDAMENTO TEÓRICO
Aunque los semáforos tienen ciertas ventajas que garantizan su éxito en los problemas de sincronización entre procesos, también sufren ciertas debilidades. Por ejemplo, es posible que se produzcan errores de temporización cuando se usan. Sin embargo, la debilidad más importante reside en su propio uso, es decir, es fácil que un programador cometa algún error al, por ejemplo, intercambiar erróneamente un wait y un signal.
Con el objetivo de mejorar los mecanismos de sincronización y evitar este tipo de problemática, en los últimos años se han propuesto soluciones de más alto nivel, como es el caso de los monitores.
Básicamente, un tipo monitor permite que el programador defina una serie de operaciones públicas sobre un tipo abstracto de datos que gocen de la característica de la exclusión mutua. La idea principal está ligada al concepto de encapsulación, de manera que un procedimiento definido dentro de un monitor sólo puede acceder a las variables que se declaran como privadas o locales dentro del monitor. Esta herramienta está incorporada en lenguajes tales como el Concurrent Pascal, Concurrent Euclid, CCNPascal, CSP/K, etc. Fue propuesta por Brinch Hansen y por Hoare, aunque de manera independiente (Pérez Martinez, 2005).
Un tipo abstracto de datos está caracterizado por un conjunto de declaraciones de variables cuyos valores definen el estado de una instancia de ese tipo, y por un conjunto de operaciones que actúan sobre dichas variables. Gráficamente un tipo abstracto de datos se puede representar como se indica en la figura 1.
[pic 2]
Figura 1. Tipo Abstracto de Dato: Monitor
Esta abstracción de datos es implementada de diferentes formas según el lenguaje que lo soporte. Así en Pascal FC la estructura del TAD es la siguiente:
monitor nombremonitor; export procedimientos_exportados; var variables_locales;
procedure proc1(parametros); var variables_locales; begin {código del procedimiento} end;
procedure proc2(parametros); var variables_locales; begin {código del procedimiento} end; . . . begin {código de inicialización} end; |
La llamada a un procedimiento de un monitor se debe realizar siguiente la siguiente sintaxis:
nombremonitor.proc1(parámetros); |
- PROCEDIMIENTO
En la presente práctica, veremos dos aplicaciones directas de los monitores: la exclusión mutua y las condiciones de sincronización.
EXCLUSIÓN MUTUA
Una de las ventajas de los monitores frente a los semáforos es que distinguen entre exclusión mutua y condiciones de sincronización. Además, la primera siempre se tiene por defecto debido a que los procedimientos anidados en el monitor siempre se ejecutan de ese modo. Esto significa que no es responsabilidad del programador asegurar la exclusión mutua, sino que es el sistema subyacente (el compilador, la biblioteca o el sistema operativo, dependiendo de los casos) el que debe implementar dicho comportamiento.
Si dos o más procesos intentar ejecutar simultáneamente algún procedimiento del monitor, sólo uno de ellos tiene éxito, y el resto espera en una estructura de cola FIFO, que llamamos cola de entrada al monitor. Un proceso que llega al monitor cuando éste está siendo utilizado, simplemente se coloca al final de la cola de entrada.
Ejemplo 1. Supongamos que varios procesos deben incrementar el valor de una variable compartida y poder examinar su valor en cualquier momento. Evidentemente, el acceso a dicha variable debe realizarse en exclusión mutua. Para ellos definiremos un monitor que encapsulará dicha variable compartida.
monitor incremento; export inc, valor; var i:integer;
procedure inc; begin i:=i+1; end;
function valor:integer begin valor:=i; end; begin i:=0; end; |
Para utilizar este monitor, los distintos procesos activos deberán invocar a los procedimientos exportados de la siguiente forma:
incremento.inc; v:=incremento.valor; writeln(v); |
Sol.
program ejem1; monitor incremento; export inc, imp; var i:integer; procedure inc; begin i:=i+1; end;
procedure imp; begin writeln(i); end;
begin i:=0; end; process inc; var x: integer; begin for x:=1 to 5 do incremento.inc; end; process imp; var x: integer; begin for x:=1 to 5 do incremento.imp; end; begin cobegin inc; imp; coend; end. |
...