Tema 5. Programación Concurrente
Tema 5. Programación Concurrente
Tema 5. Programación Concurrente
PROGRAMACIÓN
CONCURRENTE.
1
5.1. Ejecución concurrente.
• Un programa concurrente está formado por una colección de procesos
secuenciales autónomos que se ejecutan (aparentemente) en paralelo.
• Podemos distinguir tres formas de ejecutar una colección de procesos
concurrentes:
1. Los procesos multiplexan sus ejecuciones sobre un único procesador
(multiprogramación).
2. Los procesos multiplexan sus ejecuciones sobre un sistema
multiprocesador de memoria compartida (multiproceso).
3. Los procesos multiplexan sus ejecuciones en varios procesadores que no
comparten memoria (procesamiento distribuido).
• El término concurrencia indica paralelismo potencial.
• Vida de un proceso:
terminado
esperando
inicio hijo
Resume B Resume A
5 4
• Existen tres tareas activas: P.all, Q.all y la primera tarea que fue creada.
• Esta tarea se convierte en anónima al reasignar su puntero.
ADC
Transductor
Calentador Switch T
P ADC
• Problema: Ambas tareas hacen uso de la pantalla => hace falta gestionar el
acceso a este recurso compartido.
Tema 5. Programación concurrente. 19
5.5. Comunicación y sincronización con
variables comunes.
• Hay veces en las que los procesos cooperan para un fin común o compiten
por la utilización de recursos.
• Para ello es necesario realizar operaciones de comunicación y sincronización
entre procesos:
– Dos procesos se comunican cuando hay una transferencia de información
de uno a otro.
– Dos procesos están sincronizados cuando hay restricciones en el orden en
que ejecutan algunas de sus acciones.
• La forma más sencilla de comunicación entre dos procesos o más procesos
consiste en la compartición de variables comunes.
• El acceso incontrolado a variables comunes
– Hace que el resultado de la ejecución dependa del orden en que se
intercalan las instrucciones de dos o más procesos: condición de carrera
(race condition).
– Es una situación anómala que hay que evitar
Tema 5. Programación concurrente. 20
5.5. Comunicación y sincronización con
variables comunes.
Mecanismos de sincronización
• Sección crítica: secuencia de instrucciones que debe ejecutarse de forma
indivisible.
• Exclusión mutua: forma de sincronización que se usa para proteger una
sección crítica.
• Espera ocupada
while Test_and_Set(Flag) loop
null;
end loop;
-- Sección Crítica
Flag:= False;
– La operación Test_and_Set es atómica.
– Ineficiente.
– Los protocolos que usan esperas ocupadas son difíciles de diseñar,
entender y demostrar su correctitud.
Tema 5. Programación concurrente. 21
5.5. Comunicación y sincronización con
variables comunes.
Mecanismos de sincronización
• Semáforos
– Un semáforo es una variable que toma valores enteros no negativos.
– Además de asignarle un valor inicial, sólo se pueden hacer dos
operaciones (indivisibles) sobre un semáforo: wait y signal.
– Ejemplo: Mutex : Semaforo; -- Inicializado a 1 por defecto
task t1; task t2;
task body t1 is begin task body t2 is begin
loop loop
... ...
Wait(Mutex); Wait(Mutex);
-- Sección Crítica 1 -- Sección Crítica 2
Signal(Mutex); Signal(Mutex);
... ...
end loop; end loop;
end t1; end t2;
• Hay ocasiones en las que no es posible prever el orden en que se van a invocar
las distintas entradas de un tarea. En estos caso se usa espera selectiva.
• Esto ocurre cuando una tarea servidora acepta llamadas de varios clientes, pero
no sabe el orden en que los clientes van a realizar las llamadas.
• Es necesario que una tarea pueda esperar simultáneamente llamadas en varias
entradas.
Tema 5. Programación concurrente. 31
5.6. Comunicación y sincronización mediante
mensajes.
Modelo de Ada
• Para ello, Ada dispone de la cláusula select.
task body Tarea_Calculadora is ... select
begin when <Expresión_Booleana> =>
-- Inicialización del servicio accept <entrada> do . . . end <entrada>;
loop -- cualquier secuencia de instrucciones
select or
accept Suma (S1, S2: integer; S : out integer) do -- similar
... ...
end Suma; end select;
or
accept Resta (M, S: integer; R : out integer) do
...
end Resta;
end select;
end loop;
end Tarea_Calculadora;
• Además de las alternativas accept, pueden existir otras: una cláusula else, una
cláusula terminate o una cláusula delay.
Tema 5. Programación concurrente. 32
5.6. Comunicación y sincronización mediante
mensajes.
Modelo de Ada
• Else se ejecuta si no hay otra alternativa inmediatamente ejecutable.
• Delay será estudiada en el tema siguiente.
• Terminate: sólo se puede elegir si no hay tareas que puedan invocar al select,
y la tarea que lo ejecuta será terminada.
procedure P is begin
task server is server.E1;
entry E1; -- Sin terminate, P nunca terminaría
end server; -- debido al bucle de la tarea server
task body server is begin end P;
loop
select
accept E1 do ... end E1;
or
terminate;
end select;
end loop;
end server;
Tema 5. Programación concurrente. 33