Clase 5 - Programacin Concurrente - 2021
Clase 5 - Programacin Concurrente - 2021
Clase 5
Facultad de Informática
UNLP
Links al archivo con audio
La teoría con los audios está en formato MP4. Debe descargar los
archivos comprimidos de los siguientes links:
Clase 5 2
Monitores
Conceptos básicos
Semáforos ⇒
• Variables compartidas globales a los procesos.
• Sentencias de control de acceso a la sección crítica dispersas en el código.
• Al agregar procesos, se debe verificar acceso correcto a las variables compartidas.
• Aunque exclusión mutua y sincronización por condición son conceptos distintos,
se programan de forma similar.
Clase 5 4
Conceptos básicos
Clase 5 5
Notación
Clase 5 6
Notación
monitor NombreMonitor {
declaraciones de variables permanentes;
código de inicialización
Clase 5 7
Ejemplo de uso de monitores
Clase 5 8
Ejemplo de uso de monitores
Clase 5 9
Sincronización
Disciplinas de señalización:
• Signal and continued ⇒ es el utilizado en la materia.
• Signal and wait.
Clase 5 10
Operaciones adicionales
Clase 5 11
Sincronización
Clase 5 12
Sincronización
Clase 5 13
Sincronización
Call Return
1 3
Clase 5 14
Sincronización
Clase 5 15
Sincronización
Wait
Clase 5 16
Sincronización
Call Return
1 Signal&Wait
3
Clase 5 17
Sincronización
Call Return
1 3
Clase 5 18
Sincronización
Clase 5 19
Sincronización
Resumen: diferencia entre las disciplinas de señalización
• Signal and Wait: el proceso que hace el signal pasa a competir por
acceder nuevamente al monitor, mientras que el proceso despertado pasa a
ejecutar dentro del monitor a partir de instrucción que lógicamente le
sigue al wait.
Clase 5 20
Sincronización
Resumen: diferencia entre wait/signal con P/V
WAIT P
El proceso siempre se duerme El proceso sólo se duerme si el
semáforo es 0.
SIGNAL V
Si hay procesos dormidos Incrementa el semáforo para
despierta al primero de ellos. que un proceso dormido o que
En caso contrario no tiene hará un P continue.
efecto posterior. No sigue ningún orden al
despertarlos.
Clase 5 21
Ejemplo de uso de monitores
Clase 5 22
Ejemplos y técnicas
Ejemplo
Simulación de semáforos: condición básica
Puede quedar el semáforo con un valor
monitor Semaforo menor a 0 (no cumple las propiedades de
{ int s = 1; cond pos; los semáforos).
procedure P ()
{ if (s == 0) wait(pos); monitor Semaforo
s = s-1; { int s = 1; cond pos;
};
procedure P ()
procedure V () { while (s == 0) wait(pos);
{ s = s+1; s = s-1;
signal(pos); };
};
}; procedure V ()
{ s = s+1;
¿Qué diferencia hay con los semáforos? signal(pos);
};
¿Que pasa si se quiere que los procesos
pasen el P en el orden en que llegan? };
Clase 5 24
Técnicas de Sincronización
Simulación de semáforos: Passing the Conditions
Simulación de Semáforos
Como resolver este problema al no
monitor Semaforo contar con la sentencia empty.
{ int s = 1; cond pos;
procedure P ()
{ if (s == 0) wait(pos) monitor Semaforo
else s = s-1; { int s = 1, espera = 0; cond pos;
}; procedure P ()
procedure V () { if (s == 0) { espera ++; wait(pos);}
{ if (empty(pos) ) s = s+1 else s = s-1;
else signal(pos); };
}; procedure V ()
}; { if (espera == 0 ) s = s+1
else { espera --; signal(pos);}
};
};
Clase 5 25
Técnicas de Sincronización
Alocación SJN: Wait con Prioridad
Alocación SJN
monitor Shortest_Job_Next Se usa wait con prioridad para ordenar los
{ bool libre = true; procesos demorados por la cantidad de
cond turno; tiempo que usarán el recurso.
Clase 5 27
Técnicas de Sincronización
Buffer Limitado: Sincronización por Condición Básica
Buffer Limitado
monitor Buffer_Limitado
{ typeT buf[n];
int ocupado = 0, libre = 0; cantidad = 0;
cond not_lleno, not_vacio;
procedure depositar(typeT datos)
{ while (cantidad == n) wait (not_lleno);
buf[libre] = datos;
libre = (libre+1) mod n;
cantidad++;
signal(not_vacio);
}
procedure retirar(typeT &resultado)
{ while (cantidad == 0) wait(not_vacio);
resultado=buf[ocupado];
ocupado=(ocupado+1) mod n;
cantidad--;
signal(not_lleno);
}
}
Clase 5 28
Técnicas de Sincronización
Lectores y escritores: Broadcast Signal
Lectores y escritores
monitor Controlador_RW
{ int nr = 0, nw = 0;
cond ok_leer, ok_escribir
procedure pedido_leer( ) El monitor arbitra el acceso a la BD.
{ while (nw > 0) wait (ok_leer);
nr = nr + 1;
} Los procesos dicen cuándo quieren
procedure libera_leer( ) acceder y cuándo terminaron ⇒
{ nr = nr - 1; requieren un monitor con 4
if (nr == 0) signal (ok_escribir); procedures:
} • pedido_leer
procedure pedido_escribir( )
{ while (nr>0 OR nw>0) wait (ok_escribir); • libera_leer
nw = nw + 1; • pedido_escribir
}
procedure libera_escribir( ) • libera_escribir
{ nw = nw - 1;
signal (ok_escribir);
signal_all (ok_leer);
}
}
Clase 5 29
Técnicas de Sincronización
Lectores y escritores: Passing the Condition
Otra solución al problema de lectores y escritores
monitor Controlador_RW
{ int nr = 0, nw = 0, dr = 0, dw = 0; procedure pedido_escribir( )
cond ok_leer, ok_escribir { if (nr>0 OR nw>0)
{ dw = dw +1;
wait (ok_escribir);
procedure pedido_leer( ) }
{ if (nw > 0) else nw = nw + 1;
{ dr = dr +1; }
wait (ok_leer);
} procedure libera_escribir( )
else nr = nr + 1; { if (dw > 0)
} { dw = dw -1;
signal (ok_escribir);
procedure libera_leer( ) }
{ nr = nr - 1; else { nw = nw -1;
if (nr == 0 and dw > 0) if (dr > 0)
{ dw = dw -1; { nr = dr;
signal (ok_escribir); dr = 0;
nw = nw +1; signal_all (ok_leer);
} }
} }
}
}
Clase 5 30
Técnicas de Sincronización
Diseño de un reloj lógico: Covering conditions
Clase 5 31
Técnicas de Sincronización
Diseño de un reloj lógico: Wait con prioridad
procedure tick( )
{ hora_actual = hora_actual + 1;
while (minrank(espera) <= hora_actual)
signal (espera);
}
}
Clase 5 32
Técnicas de Sincronización
Diseño de un reloj lógico: Variables conditions privadas
procedure tick( )
{ int aux, idAux;
hora_actual = hora_actual + 1;
aux = verPrimero (dormidos);
while (aux <= hora_actual)
{ sacar (dormidos, idAux)
signal (espera[idAux]);
aux = verPrimero (dormidos);
}
}
}
Clase 5 33
Técnicas de Sincronización
Peluquero dormilón: Rendezvous
Problema del peluquero dormilón (sleeping barber).
Una ciudad tiene una peluquería con 2 puertas y unas pocas sillas. Los clientes entran
por una puerta y salen por la otra. Como el negocio es chico, a lo sumo un cliente o
el peluquero se pueden mover en él a la vez. El peluquero pasa su tiempo atendiendo
clientes, uno por vez. Cuando no hay ninguno, el peluquero duerme en su silla.
Cuando llega un cliente y encuentra que el peluquero está durmiendo, el cliente lo
despierta, se sienta en la silla del peluquero, y duerme mientras el peluquero le corta
el pelo. Si el peluquero está ocupado cuando llega un cliente, éste se va a dormir en
una de las otras sillas. Después de un corte de pelo, el peluquero abre la puerta de
salida para el cliente y la cierra cuando el cliente se va. Si hay clientes esperando, el
peluquero despierta a uno y espera que se siente. Sino, se vuelve a dormir hasta que
llegue un cliente.
Clase 5 34
Técnicas de Sincronización
Peluquero dormilón: Rendezvous
Clase 5 36
Ejemplo: Scheduling de disco
Clase 5 37
Ejemplo: Scheduling de disco
a) y b) Dependen del estado del disco (seek time >> rotational delay) ⇒ para
reducir el tiempo de acceso promedio conviene minimizar el movimiento de la
cabeza (reducir el tiempo de seek).
El scheduling de disco puede tener distintas políticas:
• Shortest-Seek-Time (SST): selecciona siempre el pedido pendiente que quiere el
cilindro más cercano al actual. Es unfair.
• SCAN, LOOK, o algoritmo del ascensor: se sirven pedidos en una dirección y luego se
invierte. Es fair. Problema: un pedido pendiente justo detrás de la posición actual de la
cabeza no será servido hasta que la cabeza llegue al final y vuelva (gran varianza del
tiempo de espera).
• CSCAN o CLOOK: se atienden pedidos en una sola dirección. Es fair y reduce la
varianza del tiempo de espera.
Clase 5 38
Ejemplo: Scheduling de disco
Monitor separado
El scheduler es implementado por un monitor para que los datos sean accedidos solo
por un proceso usuario a la vez.
El monitor provee dos operaciones: pedir y liberar.
Un proceso usuario que quiere acceder al cilindro cil llama a pedir(cil), y retoma el control
cuando el scheduler seleccionó su pedido. Luego, el proceso usuario accede al disco
(llamando a un procedure o comunicándose con un proceso manejador del disco).
Luego de acceder al disco, el usuario llama a liberar:
Scheduler_Disco.pedir(cil) - Accede al disco - Scheduler_Disco.liberar( )
Suponemos cilindros numerados de 0 a MAXCIL y scheduling CSCAN.
A lo sumo un proceso a la vez puede tener permiso para usar el disco, y los pedidos
pendientes son servidos en orden CSCAN.
posicion es la variable que indica posición corriente de la cabeza (cilindro que está siendo
accedido por el proceso que está usando el disco).
Para implementar CSCAN, hay que distinguir entre los pedidos pendientes a ser servidos en
el scan corriente y los que serán servidos en el próximo scan.
Clase 5 39
Ejemplo: Scheduling de disco
Monitor separado
monitor Scheduler_Disco
{ int posicion = -1, v_actual = 0, v_proxima = 1;
cond scan[2];
procedure liberar()
{ if (!empty(scan[v_actual])) posicion = minrank(scan[v_actual]);
elseif (!empty(scan[v_proxima]))
{ v_actual :=: v_proxima;
posicion = minrank(scan[v_actual]);
}
else posicion = -1;
signal(scan[v_actual]);
}
}
Clase 5 40
Ejemplo: Scheduling de disco
Monitor intermedio
MEJOR: usar un monitor como intermediario entre los procesos usuario y el disk
driver. El monitor envía los pedidos al disk driver en el orden de preferencia deseado.
Mejoras:
• La interfaz al disco usa un único monitor, y los usuarios hacen un solo llamado al monitor
por acceso al disco.
• La existencia o no de scheduling es transparente.
• No hay un protocolo multipaso que deba seguir el usuario y en el cual pueda fallar.
Clase 5 41
Ejemplo: Scheduling de disco
Monitor intermedio
monitor Interfaz_al_Disco
{ variables permanentes para estado, scheduling y transferencia de datos.
procedure usar_disco(int cil, parámetros de transferencia y resultados)
{ esperar turno para usar el manejador
almacenar parámetros de transferencia en variables permanentes
esperar que se complete la transferencia
recuperar resultados desde las variables permanentes
}
procedure buscar_proximo_pedido(algunType &resultados)
{ seleccionar próximo pedido
esperar a que se almacenen los parámetros de transferencia
setear resultados a los parámetros de transferencia
}
procedure transferencia_terminada(algunType resultados)
{ almacenar los resultados en variables permanentes
esperar a que resultados sean recuperados por el cliente
}
}
Clase 5 42
Ejemplo: Scheduling de disco
Monitor intermedio
monitor Interfaz_al_disco
{ int posicion = -2, v_actual = 0, v_proxima = 1, args = 0, resultados = 0;
cond scan[2];
cond args_almacenados, resultados_almacenados, resultados_recuperados;
argType area_arg; resultadoType area_resultado;
Clase 5 43
Ejemplo: Scheduling de disco
Monitor intermedio
Clase 5 44