Monitor - Instituto de Gobierno y Desarrollo Humano

Anuncio
SINCRONIZACIÓN
Karim Guevara Puente de la Vega
[email protected]
2015
2
Mecanismos de sincronización
Exclusión mutua con
espera activa
SLEEP y WAKEUP
Semáforos
Monitores
Transferencia de
mensajes
3
Introducción

Problema:
 Semáforos, siempre están sujetas a errores, como la omisión o mala
ubicación de una operación P o V.

Solución:
 1974 (Hoore) y 1975 (B.Hanse) :
 Proponen una primitiva de sincronización de más alto nivel: MONITOR
4
Monitor




Módulo Monitor- Colección de procedimientos, variables y
estructuras de datos, agrupados en una especie de módulo.
Monitor- TDA para el cual un proceso/hilo puede estar
ejecutando cualquiera de sus procedimientos miembro en
cualquier momento.
Los únicos que acceden a las estructuras internas del monitor
son los procedimientos declarados en el monitor.
La ejecución de la función miembro se trata como una
sección crítica
5
Monitor

Procesos
 Invocan a procedimientos del monitor.
 No pueden acceder directamente a las
variables del monitor

Procedimientos del monitor:
 No pueden acceder a variables externas
 Pero si a las permanentes (i y c), a las
locales al procedimiento, y a los
argumentos del procedimiento (x).

Inicializar las variables permanentes del
monitor antes que ningún procedimiento
sea ejecutado.
monitor ejemplo {
private:
int i = 0;
condition c ;
public:
productor (x) {
…
…
};
consumer (x) {;
…
…
};
};
6
Implementación de la Exclusión Mutua
“Solamente un proceso puede estar activo a la
vez dentro de un monitor”.


Los monitores son una construcción de los lenguajes de
programación, los compiladores saben que las llamadas a los
procedimientos de un monitor se manejan de forma distinta a
las llamadas a los procedimientos convencionales.
La implementación de la exclusión mutua en las entradas del
monitor es labor del compilador  semáforo binario 
protocolo de un procedimiento de monitor  Bajar(S) a
Subir(S).
7
Implementación de la Exclusión Mutua
monitor unTAD {
private:
semaforo mutex = 1;
< estructuras de datos del TAD >
...
public:
proced_i(...) {
P(mutex);
<procesamiento para proced_i>
V(mutex);
};
. . .
}
8
monitor balCompartido {
private:
int balance;
public:
aportar(int cantidad){
balance=balance+cantidad;
}
retirar(int cantidad){
balance=balance–cantidad;
}
};
Proc_0(){
...
balCompartido.aportar(cantidad);
...
}
Proc_1() {
...
balCompartido.retirar(cantidad);
...
}
fork(proc_0);
fork(proc_1);
9
Variables de condición

Si un proceso descubre que no puede seguir, hasta que otro
proceso cambie el estado de la información protegida por el
monitor…..
Monitor lectorEscritor_1 {
int nLectores = 0;
int nEscritores = 0;
boolean ocupado = FALSE;
public:
iniciarLectura() {
while (nEscritores != 0) ;
nLectores ++;
}
finalizarLectura() {
nLectores -- ;
}
...
}
Monitor lectorEscritor_1 {
...
public:
...
iniciarEscritura () {
nEscritores ++;
while(ocupado || nLectores >0);
ocupado = TRUE;
}
finalizarEscritura () {
nEscritores--;
ocupado = FALSE;
}
}
10
Variables de condición


Solución: permitir que el proceso en espera ceda
temporalmente el monitor (se bloquee)
Se incluyen las variables de condición:
 Estructura de datos, global a todos los procedimientos del monitor.
 Puede ser modificado por:
 wait(): proceso invocador se suspende
 signal(): reanuda exactamente un proceso si hay uno suspendido
actualmente
 queue(): es TRUE si hay un hilo/proceso suspendido sobre la variable de
condición, y FALSE en otro caso
11
Variables de condición



No son contadores, no acumulan señales para su uso futuro
(semáforos).
Si una variable de condición recibe una señal y ningún
proceso está esperando esta variable, la señal se perderá (wait
antes de signal).
¿Qué sucede después de signal?
 Hoare: si P1 esta esperando la señal, y P0 la ejecuta, éste último
cede el monitor a P1 para continuar su ejecución.
 B. Hansen: P0 ejecuta la señal y continua ejecutándose, luego P1
intenta ejecutarse comprobando la condición.
 Menos cambios de contexto.
12
Lectores & Escritores
monitor lectorEscritor_2 {
int nLectores = 0;
boolean ocupado = FALSE;
condition okLeer, okEscribir;
public:
iniciaLectura( ){
if(ocupado ||(okEscribir.queue())
okLeer.wait( ) ;
nLectores++;
okLeer.signal( );
}
finalizaLectura( ){
nLectores-- ;
if (nLectores == 0)
okEscribir.signal( );
}
...
};
...
iniciaEscritura(){
if(nLectores!=0 || ocupado)
okEscribir.wait()
ocupado = TRUE;
}
finalizaEscritura(){
ocupado = FALSE;
if(okEscribir.queue())
okEscribir.signal();
else
okLeer.signal();
}
};
13
Lectores & Escritores
monitor lectorEscritor_2 {
int nLectores = 0;
boolean ocupado = FALSE;
Proceso Lector(){
condition okLeer, okEscribir;
public:
while(TRUE){
iniciaLectura( ){
...
if(ocupado ||(okEscribir.queue())
lectorEscritor_2.iniciaLectura();
okLeer.wait( ) ;
acceder_recurso();
nLectores++;
lectorEscritor_2.finalizaLectura();
okLeer.signal( );
}
...
finalizaLectura( ){
}
nLectores-- ;
}
if (nLectores == 0)
okEscribir.signal( );
}
...
};
14
Lectores & Escritores
monitor lectorEscritor_2 {
...
public:
iniciaEscritura(){
if(nLectores!=0 || ocupado)
okEscribir.wait()
ocupado = TRUE;
}
finalizaEscritura(){
ocupado = FALSE;
if(okEscribir.queue())
okEscribir.signal();
else
okLeer.signal();
}
};
Proceso Escritor(){
while(TRUE ){
...
lectorEscritor_2.iniciaEscritura();
acceder_recurso();
lectorEscritor_2.finalizaEscritura();
...
}
}
15
Productor - consumidor
monitor ProdCons{
condition lleno, vacio;
int cuenta = 0;
public:
insertar(int elem){
if(cuenta==N) lleno.wait();
insertar_elem(elem);
cuenta++:
if(cuenta==1) vacio.signal();
}
int quitar(){
if(cuenta==0) vacio.wait();
quitar=quitar_elem();
cuenta--;
if(cuenta==N–1)lleno.signal();
}
};
Productor(){
while(true){
elem=producir_elem();
ProdCons.insertar (elem);
}
};
Consumidor(){
while(true){
elem=ProdCons.quitar();
consumir_elem (elem);
}
};
16
Ventajas vs. desventajas

Ventajas:
 Monitores hacen que la programación paralela sea menos propensa a
errores que los semáforos.
 Exclusión mutua es automática.

Desventajas:
 Monitores son un concepto del lenguaje de programación.
 El compilador debe de reconocerlos y gestionar la exclusión mutua.
17
Mecanismos de sincronización
Exclusión mutua con
espera activa
SLEEP y WAKEUP
Semáforos
Monitores
Transferencia de
mensajes
18
Comunicación por paso de mensajes

La comunicación por mensajes se da “normalmente” en el
siguiente caso:
 Espacio de direcciones independientes


Sincronización : Cuando dos procesos se comunican vía
mensajes se necesitan mecanismos para que el proceso
receptor espere (se suspenda hasta) a que el proceso emisor
envíe el mensaje y éste esté disponible.
No aparece el problema de la sección crítica.
19
Uso de almacenamiento intermedio

Sin almacenamiento intermedio:
 S.O. no dedica espacio al mecanismo de comunicación.
 Emisor y receptor deben “esperarse” (comunicación síncrona).
 S.O. copia directamente desde buffer del emisor al receptor.

Con almacenamiento intermedio:





S.O. dedica espacio al mecanismo de comunicación.
Asincronía entre emisor y receptor.
Envío de mensaje: copia desde buffer de emisor a almacén de S.O.
Recepción del mensaje: copia desde almacén a buffer del receptor.
Más flexible pero menos eficiente (2 copias).
20
Paso de mensajes

Permite que dos procesos se comuniquen sin necesidad de
utilizar variables compartidas:
 Enviar (send): expide un mensaje a un proceso destino.
 Recibir (receive): indica el deseo de recibir un mensaje de algún
proceso fuente.



Ambas no son construcciones del lenguaje de programación,
sino Llamadas al Sistema.
Es válido para cualquier sistema multiproceso con o sin
memoria compartida, con una o varias CPU´s.
Su semántica solamente indica el paso de información de un
proceso a otro.
21
Paso de mensajes


La independencia del hw hace que los programas que utilizan
como mecanismos de sincronización y comunicación sean más
portables  requieren tener el mismo S.O (protocolo de
comunicación).
Enlace de comunicación: debe existir si dos procesos A y B
quieren comunicarse, enviarse y recibir mensajes:
 ¿Un enlace puede ser unidireccional o bidireccional?
 Modelos de comunicación: directa o indirecta, simétrica o asimétrica.
22
Modelos de comunicación

Comunicación Directa
 Tanto el emisor como el receptor deben indicar explícitamente el
proceso destino o remitente del mensaje.
send (Proceso_Destino, Mensaje)
receive (Proceso_Origen, Mensaje)
23
Modelos de comunicación

Comunicación Directa
 Características
 Automáticamente se establece un enlace entre cada par de procesos que se
quieren comunicar.
 Cada proceso necesita saber la identidad del otro proceso.
 Un enlace asocia únicamente a dos procesos.
• Entre cada par de procesos existe un enlace.
 El enlace puede ser unidireccional o bidireccional.
24
Modelos de comunicación

Comunicación Directa
process Observador;
repeat
. . .
Esperar_Evento;
. . .
Enviar(Reportero, Mensaje);
forever;
end Observador;
process Reportero;
repeat
. . .
Recibir(Observador, Mensaje);
Imprimir_Evento;
forever;
end Reportero;
25
Modelos de comunicación

Comunicación Directa
 Simétrica – receptor sólo recibe mensajes de un proceso
26
Modelos de comunicación

Comunicación Directa
 Asimétrica – puede haber múltiples procesos enviando mensajes a
un único receptor.
27
Modelos de comunicación

Comunicación Indirecta




Mensajes se envían a buzones no a procesos
Receptor, indica el buzón del que quiere recibir un mensaje.
Cada buzón tiene un identificador único.
Un proceso puede comunicarse con otros procesos por medio de
distintos buzones.
28
Modelos de comunicación

Comunicación Indirecta
 Las primitivas de envío y recepción son:
send(buzón, mensaje)
receive(buzón, mensaje)
29
Modelos de comunicación

Comunicación Indirecta
 Propiedades del enlace de comunicaciones:
 Dos procesos se pueden comunicar si comparten un buzón
 Un enlace de comunicación puede estar asociado a más de dos procesos.
 Entre cada pareja de procesos comunicantes puede haber varios enlaces,
cada enlace corresponde a un buzón.
 Enlace puede ser unidireccional o bidireccional.
 La comunicación se mantiene en tanto el buzón no cambie de identificador.
30
Capacidad del buzón

Capacidad limitada
 La cola tiene una longitud máxima (n mensajes)
 Si el buzón está lleno y llega un mensaje:
 Proceso emisor queda bloqueado en espera de que haya espacio libre en el
buzón.
 En la llamada a enviar se indica un parámetro de salida: estado de error,
que indicará el llenado del buzón. Emisor no se bloquea, y decide si lo
reenvía o no el mensaje.
 Buzones se implementan generalmente por un buffer circular.
31
Capacidad del buzón

Capacidad Ilimitada
 La cola tiene una longitud potencialmente infinita
 Emisor nunca queda bloqueado
 Se implementa como lista encadena de mensajes
 Limitación: cantidad de memoria que el proceso tiene disponible.
32
Capacidad del buzón

Capacidad Nula
 Cola tiene una longitud máxima de cero.
 No hay mensajes en el buzón esperando a ser recibidos.
 Emisor debe esperar hasta que destinatario reciba el mensaje.
 Dos procesos deben de ponerse de acuerdo en el momento de realizar
envío/recepción del mensaje: comunicación síncrona (rendezvous).
 Si capacidad > 0, comunicación asíncrona
33
Productor - Consumidor
#define N 100
void productor(void){
int elem;
mensaje m;
while(TRUE){
elem=producir_elem();
receive(consumidor, &m);
formar_mensaje(&m,elem);
send(consumidor,&m);
}
}
void consumidor(void){
int elem, i;
mensaje m;
for(i=0; i<N; i++)
send(productor, &m);
while(TRUE){
receive(productor, &m);
elem=extraer_elem(&m);
send(productor,&m);
consumir_elem(elem);
}
}
Descargar