Documente Academic
Documente Profesional
Documente Cultură
Tema 3
Grado en Informtica
Bibliografa
z
Captulo 4
Principles of Concurrent and Distributed Programming M. Ben-Ari. Prentice Hall, 2006 (Segunda Edicion)
Captulo 6
Sincronizacin de Barrera
{ { {
Conclusiones
Qu es un Semforo?
z
Dijkstra (1968), introdujo la primera primitiva de sincronizacin con espera pasiva y la llam Semforo Son herramientas de bajo nivel que permiten la sincronizacin condicional entre procesos y la exclusin mutua en el acceso a las secciones crticas
Dijkstra (1930-2002)
Qu es un Semforo?
z
Un semforo es una Clase (Programacin Orientada a Objetos) o Tipo Abstracto de Datos (Programacin estructurada) En la parte privada tiene un contador de permisos y un conjunto de procesos bloqueados En la E l parte t pblica bli ti tiene mtodos t d ( (o procedimientos) di i t ) para bloquear y desbloquear procesos dependiendo del contador de permisos del semforo
Qu es un Semforo?
z
Valores permitidos:
En general los valores permitidos para un semforo son enteros no negativos. Cuando slo admiten como valor 0 y 1 se denominan semforos binarios.
Qu es un Semforo?
z
wait(s);
Si el valor del semforo es mayor que 0 (s>0), se decrementa una unidad y el proceso contina su ejecucin
s := s - 1
Si el valor del del semforo es cero (s=0) el proceso suspende su ejecucin, pasa al estado bloqueado y se aade al conjunto de procesos bloqueados en el semforo
Qu es un Semforo?
z z
Qu es un Semforo?
z
El proceso que ejecuta wait necesita llevarse una bola de la caja Si no hay bolas, se bloquea hasta que haya
signal(s);
z z
Siempre echa una bola a la caja Si algn l proceso estaba b esperando d b bola, l l la coge y se d desbloquea bl
Qu es un Semforo?
z
Las operaciones de gestin del semforo reciben diferentes nombres dependiendo del sistema operativo, lenguaje de programacin y/o librera. release V Descripcin Losnombres que Dijkstra puso originalmente alas operaciones enholands.Vproviene deverhogen (incrementar)yPproviene deportmanteauprolaag (intentar reducir) ALGOL68,elkerneldeLinuxkernelyalgunos libros detexto PascalFC yalgunoslibrosdetexto Procuresignificaobteneryvacate desocupar APIjava.util.concurrent.Semaphore (Java)
acquire P
10
acquire
Qu es un Semforo?
z
Tipos de Semforos
Semforos Binarios (0 y 1) Semforos Generales o No negativos FIFO (First In, First Out): Los procesos se desbloquean en orden de llegada Aleatorio: Los procesos se desbloquean aletoriamente
11
Semforos en Pascal-FC
z
initial(s,valorInicial);
z z
Asigna un valor inicial (no negativo) al semforo Solo se puede llamar en la parte secuencial del programa principal (fuera del cobegin coend)
12
Semforos en Pascal-FC
z
13
Semforos en Pascal-FC
z z
Slo se pueden definir variables de tipo semforo en el programa principal Se pueden pasar como parmetros a procesos, procedimientos y funciones, necesitan ser parmetros p p por referencia. (var en PascalFC) )
14
{ {
15
Exclusin Mutua
z
Seccin Crtica
z
Representa una secuencia de instrucciones que debe ejecutar cada proceso sin que haya interferencia con la ejecucin de instrucciones de las secciones crticas de los dems procesos. Normalmente se corresponde con la utilizacin de un cierto recurso comn de acceso exclusivo. Representa las sentencias que pueden ser ejecutadas concurrentemente por todos los procesos
S Seccin i No N Crtica C ti
z
16
Exclusin Mutua
z
process proceso; begin repeat preprotocolo; seccion_critica; postprotocolo; seccion_no_critica; i iti forever end;
El preprotocolo y postprotocolo son instrucciones que deben ejecutar los procesos, para garantizar que el acceso a las secciones crticas se realizan cumpliendo li d l los requisitos i it que se le exigen a la solucin Se asume que los procesos finalizan su ejecucin fuera de la seccin crtica
17
Exclusin Mutua
Ejemplo: ambos procesos acceden a una variable compartida cont. Utilizamos un semforo binario (inicializado a 1) Si el valor del semforo es 1 , la seccin crtica est libre Si el valor es 0, la seccin crtica est ocupada por otro proceso
program excMutSem; process type tProceso(var em: semaphore); begin repeat wait(em); cont := cont +1 (* Seccin Crtica *) signal(em); g ( ); (* Seccin No Crtica *) write('Seccion No Critica'); forever end; var mutex:semaphore; p1,p2:tProceso; cont : integer; begin initial( mutex,1); cont := 0; cobegin p1(mutex); p2(mutex); coend; end.
BLP (06-07) 18
18
Se tiene cuando el nmero de procesos que pueden ejecutar la seccin crtica a la vez es N >1 Se implementa con semforos generales asignando inicialmente un valor N al semforo
19
program multiplex; process type tProceso(var acceso: semaphore); begin repeat (* Preprotocolo *) wait(acceso); (* Seccin Crtica *) write('SC '); (* Postprotocolo *) signal(acceso); (* Seccin No Crtica *) write('SNC '); forever end; var acceso:semaphore; p:array [1..5] of tProceso; i:integer; begin initial(acceso,3); cobegin for i:=1 to 5 do p[i](acceso); coend; end. BLP (06-07)
El valor del semforo nos indica los huecos libres que quedan en la seccin crtica
20
20
10
{ {
21
Sincronizacin Avanzada
z
Todo programa concurrente se puede implementar con sincronizaciones condicionales y exclusiones mutuas Existen variantes de estas formas de sincronizacin que se utilizan habitualmente en la programacin concurrente En este apartado se veremos las ms usuales
22
11
Sincronizacin Condicional
z z
Se produce cuando un proceso debe esperar a que se cumpla una cierta condicin para proseguir su ejecucin Esta condicin slo puede ser activada por otro proceso
Proceso A
PA1
PA2
Proceso B
PB1
PB2
Diagrama de Precedencia
23
program sinccond;
process tPA(var continuar:boolean); begin write('PA1 '); continuar := true; write('PA2 '); end; process tPB(var continuar:boolean); begin write('PB1 '); while not continuar do null; write('PB2 '); end; var continuar: boolean; procA:tPA; procB:tPB; begin continuar := false; cobegin procA(continuar); procB(continuar); coend; end. BLP (06-07)
PA2
PB2
24
24
12
program sinccond;
Sincronizacin Condicional
process tPA(var sc:semaphore); begin write('PA1 '); signal(sc); write('PA2 '); end; process tPB(var sc:semaphore); begin write('PB1 '); wait(sc); write('PB2 '); end; var sc: semaphore; procA:tPA; procB:tPB; begin initial(sc,0); cobegin procA(sc); procB(sc); coend; end.
25
25
Rendezvous
z
Proceso A
PA1
PA2
Proceso B
PB1
PB2
Diagrama de Precedencia
26
13
program rendezvous;
Sincronizacin Condicional
Proc A P Proc B
PA1 PB1
PA2 PB2
process tPA; begin write('PA1 '); signal(aArraived); wait (bArraived); write('PA2 '); end; process tPB begin write('PB1 '); signal(bArraived); wait(aArraived); write('PB2 '); end; var aArraived bArraived: semaphore; aArraived,bArraived: procA:tPA; procB:tPB; begin initial(aArraived,0);initial(bArraived,0); cobegin procA; procB; coend; end.
27
Diagrama de Precedencia
27
Sincronizacin de Barrera
z
La Sincronizacin de Barrera es una sincronizacin condicional en la que los procesos tienen que esperar a que el resto de procesos lleguen al mismo punto para poder continuar su ejecucin Vamos a estudiar este tipo de sincronizacin con los siguientes requisitos
Programa con N procesos Cada proceso escribe la letra A A y luego la B B Los procesos tienen que esperar que todos hayan escrito la letra A antes de escribir la B
28
14
Sincronizacin de Barrera
Aproximacin Incorrecta Puede provocar interbloqueo (deadlock). El ltimo desbloquea, pero slo uno de los procesos que esperan pueden pasar
{} {} {Rendezvous} if nProcesos = NPR then signal(sbarrera); {} wait(sbarrera); write('B'); {Punto crtico} end;
29
begin nProcesos := 0; initial(sbarrera,0); initial(mutex,1); cobegin for i:=1 to NPR do proc[i]; coend; end.
Sincronizacin de Barrera
2 Aproximacin I Incorrecta t Si se deja la consulta del contador fuera de la Exclusin Mutua, puede ocurrir que dos procesos hagan signal
process type tProceso; var i:integer; begin write('A'); wait(mutexNP); nProcesos:= nProcesos + 1; signal(mutexNP); if nProcesos < NPR then wait(sbarrera) else for i:=1 to NPR-1 do signal(sbarrera); write('B'); end;
30
15
Sincronizacin de Barrera
1 Solucin C Correcta t Si el proceso no es el ltimo libera la EM y se bloquea. Si es el ltimo, sale del mutex y desbloquea a los dems procesos
const NPR=... var sbarrera: semaphore; nProcesos: integer; mutexMP: semaphore;
process type tProceso; var i:integer; begin write('A'); wait(mutexNP); nProcesos := nProcesos + 1; if nProcesos < NPR then begin signal(mutexNP); wait(sbarrera); end else begin signal(mutexNP); for i:=1 to NPR-1 do signal(sbarrera); end; write('B'); end; e d;
31
Sincronizacin de Barrera
process type tProceso; var i:integer; begin write('A'); wait(mutexNP); nProcesos := nProcesos + 1; signal(mutexNP); if nProcesos = NPR then for i:=1 to NPR do signal(sbarrera);
2 Aproximacin I Incorrecta t Si se deja la consulta del contador fuera de la Exclusin Mutua, puede ocurrir que dos procesos hagan signal
32
16
Sincronizacin de Barrera
process type tProceso; var i:integer; begin write('A'); wait(mutexNP); nProcesos := nProcesos + 1; if nProcesos = NPR then for i:=1 to NPR do signal(sbarrera); signal(mutexNP); wait(sbarrera); write('B'); end;
1 Solucin Correcta En la rama del if el proceso deja el semforo preparado para cuando l mismo ejecute un wait i
const NPR=... var sbarrera: semaphore; nProcesos: integer; mutexMP: semaphore;
33
Sincronizacin de Barrera
2 Solucin correcta turnstile (Torno)
process type tProceso; begin write('A'); wait(mutex); nProcesos := nProcesos + 1; signal (mutex); if nProcesos = NPR then signal(sbarrera); wait(sbarrera); {Torno} signal(sbarrera); { } write('B'); end;
Torno: El patrn -un wait y un signal sucesivos- ocurre a menudo y tiene un nombre Turnstie (Torno), porque slo permite el paso de un proceso a la vez y adems permite ser bloqueado para parar todos los procesos. Si inicialmente vale 0 el torno est bloqueado.
34
17
Barrera reutilizable
z
A menudo un conjunto de Hilos/Procesos que cooperan realizan una serie de pasos en un blucle y se sincronizan en una barrera cada vuelta. Para esta aplicacin necesitamos una barrera reutilizable para la entrada y la salida
35
process type tProceso; begin repeat write('A'); wait(mutex); cont := cont+1; if (cont=NPR) then begin wait(torno2); {bloquea el segundo torno} signal(torno1); {desbloquea el primero} end; signal(mutex); wait(torno1); {primer torno} signal(torno1); write('B'); {Punto crtico}
wait(mutex); cont := cont-1; if (cont=0) then begin wait(torno1); {bloquea el primero} signal(torno2); {desbloquea el segundo} end; signal(mutex); wait(torno2); {segundo torno} signal(torno2); forever; end;
36
cont : integer;
18
Estudiantes Fumadores
z
Se desea implementar un ciclo de 4 procesos que se ejecuntan concurrentemente, cada proceso muestran Ax (siendo x el nmero del proceso) y se espera antes de salir a los dems. El ltimo proceso muestra - y desbloquea a los dems Si se necesita usar una nica barrera en un bucle, debe tenerse control de los desbloqueos de los procesos
37
process type tProceso; begin write('A'); wait(mutex); cont := cont+1; if (cont<NPROCESOS) then begin signal(mutex); wait(sb); signal(desbloqueo); end else signal(mutex); wait(torno1); {primer torno} signal(torno1); write('B'); {Punto crtico}
wait(mutex); cont := cont-1; if (cont=0) then begin g wait(torno1); {bloquea el primero} signal(torno2); {desbloquea el segundo} end; signal(mutex); wait(torno2); {segundo torno} signal(torno2); initial(torno1,0); end;
38
cont : integer;
19
{ {
Sincronizacin Avanzada
z
Conclusiones
39
Metodologa de Desarrollo
z
A medida que los programas concurrentes se hacen ms complejos, se hace necesario seguir una metodologa que permita guiar el desarrollo de los mismos A continuacin se definen una serie de pasos que se pueden seguir para crear un programa concurrente partiendo de unos requisitos
40
20
Metodologa de Desarrollo
z
z z
2) Implementar lo que tiene que hacer cada proceso de forma secuencial (en el lenguaje que utilicemos) 3) Determinar los puntos de sincronizacin en el cdigo
Se pueden bloquear todos los procesos juntos? Se puede desbloquear cualquiera de ellos?
4) Programacin de wait y signal definiendo las variables necesarias para controlar la sincronizacin 5) Gestin de variables
41
z z
Hasta ahora hemos visto cmo los procesos se comunican con una variable Es habitual que los procesos se comuniquen con un buffer con varias posiciones para almacenar temporalmente informacin El buffer permite que se pueda ir insertando informacin aunque no est preparado el proceso encargado de usarla El problema tpico con el que se estudia la comunicacin con buffer es
42
21
Productores Consumidores
z
Procesos
Los Productores son procesos que generan datos Los Consumidores son procesos que consumen los datos en el orden en que se generan Cada productor genera un nico dato cada vez Un consumidor slo puede consumir un dato cuando ste haya sido generado por el productor Todos los productos se consumen
Restricciones
43
Productores Consumidores
z
Sincronizacin
Los consumidores deben de bloquearse cuando no tengan datos que consumir Los productores deben bloquearse cuando el buffer est lleno Se utilizar un buffer para almacenar los datos producidos antes de ser consumidos
Comunicacin
44
22
Productores Consumidores
var buffer:tBuffer; i:integer; prod:array [1..5] of tProductor; cons:array [1..3] of tConsumidor; begin inicializar(buffer); cobegin for i:=1 to 5 do prod[i](buffer); for i:=1 to 3 do cons[i](buffer); coend; end. process type tProductor (var buffer:tBuffer); var dato: integer; begin repeat dato := random(200); insertar(dato,buffer); forever end; process type tConsumidor (var buffer:tBuffer); var dato: integer; begin repeat sacar(dato,buffer); writeln(dato); forever end; 45
45
type tBuffer = record datos: array [1..MAXDATOS] of integer; posInser, posSacar:integer; end; procedure inicializar(var buffer:tBuffer); begin buffer.posInser p := 1; buffer.posSacar := 1; end; procedure insertar(dato:integer; var buffer:tBuffer); begin buffer.datos[buffer.posInser]:= dato; buffer.posInser := buffer.posInser MOD MAXDATOS + 1; end; procedure sacar(var dato:integer; var buffer:tBuffer); begin dato:=buffer.datos[buffer.posSacar]; buffer.posSacar := buffer.posSacar MOD MAXDATOS + 1; end;
* * * *
6 posInser 5
46
23
Productores Consumidores
z
Sincronizacin Condicional
z z
Un productor se bloquear antes de insertar un dato si el buffer est lleno Un consumidor se bloquear antes de leer un dato si el buffer est vaco Las variables de control del buffer deben estar bajo exclusin mutua
Exclusin Mutua
z
47
Productores Consumidores
z
48
24
Insertar
procedure insertar(dato:integer; var buffer:tBuffer); begin wait(buffer.nHuecos); wait(buffer.em); buffer.datos[buffer.posInser]:= dato; buffer.posInser := buffer.posInser MOD MAXDATOS + 1; signal(buffer.em); signal(buffer.nProductos); end;
49
Sacar
procedure sacar(var dato:integer; var buffer:tBuffer); begin wait(buffer.nProductos); wait(buffer.em); dato := buffer.datos[buffer.posSacar]; buffer.posSacar := buffer.posSacar MOD MAXDATOS + 1; signal(buffer.em); signal(buffer.nHuecos); end;
50
25
Sincronizacin de Barrera
{ { {
Conclusiones
51
Conclusiones
z
Permiten resolver de forma sencilla y eficiente la sincronizacin de procesos concurrentes Se pueden usar para implementar de forma muy sencilla el problema de la Exclusin Mutua Estn presentes en la mayora de lenguajes y libreras de soporte a la concurrencia
52
26
Conclusiones
z
Son primitivas de muy bajo nivel Omitir un simple signal lleva a interbloqueo Omitir un simple wait lleva a la violacin de la Exclusin Mutua Colocar las operaciones wait/signal en los lugares no adecuados llevan a comportamientos errneos del p g programa No estructuran el cdigo del programa (libertad total para acceder a las variables compartidas), lo que hace que los cdigos sean difciles de mantener y de rastrear errores
53
Conclusiones
z
Puesto que los semforos tienen ciertas desventajas, existen otras herramientas de sincronizacin de espera pasiva con mayor nivel de abstraccin
Semforos Monitores Regiones Crticas Regiones Crticas Condicionales Sucesos Buzones R Recursos Envo asncrono Envo sncrono o cita simple Invocacin Remota o cita extendida
54
27
Enunciado
Cinco filsofos dedican su vida a pensar y a comer (estas dos acciones son finitas en el tiempo). Los filsofos comparten una mesa rodeada de cinco sillas, cada una de un filsofo. En el centro de la mesa hay comida y en la mesa cinco palillos y cinco platos. De vez en cuando, un filsofo siente hambre, se sienta y trata de coger los dos palillos que hay cerca de l y come sin soltar los palillos, cuando termina de comer suelta los palillos. El problema a solucionar es crear un ritual (algoritmo que permita comer a los filsofos)
55
0 4 0 1 1 4 3 3 2 2
56
28
Los filsofos representan procesos/hilos interactivos que realizan el siguiente bucle: process type filosofo (name : integer); begin repeat Pensar; Coger palillos; Comer; Soltar Palillos; forever end;
57
Asumimos: Cada filsofo tiene una variable local i que lo identifica con valores (0..4) De forma similar los palillos estn numerados de 0 a 4.
z
Limitaciones
Slo 5 palillos (por los recortes de fondos de la Universidad) Un filsofo necesita 2 palillos para comer Un filsofo slo puede coger el palillo de su izquierda y el de su derecha
z
Por tanto un filoso hambriento debe esperar a que su vecino suelte el palillo.
58
29
Suponemos p q que los filsofos saben como comer y como pensar.. ,nuestro trabajo es hacer una versin de cogerPalillos y soltarPalillos que satisfaga las siguientes restricciones:
59
Un palillo slo puede estar en posesin de un filsofo al mismo tiempo (Exclusin mutua). Slo puede comer si tiene los dos palillos (sincronizacin condicional) di i l) Debemos evitar el deadlock y el livelock Debemos evitar el starvation de un filosofo esperando un palillo. Debe ser posible que ms de un filsofo coma al mismo tiempo
1.Raliza 1 Raliza una solucin que consiga la exclusin mutua en el uso de los palillos. Problema?
60
30
Solucin 1:
Si como mximo N-1 filsofos se sientan a la mesa.. al final uno siempre tendr dos palillos Usa un semforo general para representar N-1 sillas disponibles Evitar la espera circular. Hacer uno de los filsofos diferente (zurdo).
Solucin 12
61
z z
Cuatro amigos estn estudiando en la biblioteca cada x tiempo les apetece fumar pero no salen hasta que todos tienen ganas de fumar. Cuando al cuarto tambin le apetece fumar dice Vamos a fumar, desbloquea a los otros y salen a fumar Estn un rato fumando y vuelven a entrar, el proceso se repite. Simula el problema con semforos. Intenta realizarlo con un contador y una nica barrera.
z z
62
31