Está en la página 1de 14

ADA:

lenguaje de programación concurrente

1
Introducción

 El desarrollo de ADA ha sido patrocinado por el


gobierno de los Estados Unidos
 Estándar en 1983 / orientado a objetos 1995 (ADA95)
 Un usuario puede establecer tareas diferentes
 Cita(Rendezvous): exclusión mutua, sincronización y
comunicación entre tareas

2
Tareas

 La especificación describe la interfaz con otras tareas

task T is

end T;

 Si no presenta ninguna interfaz: task T;


 En el cuerpo se describe el comportamiento dinámico

task body T is

end T;

3
Ejemplo COMPRA

 Solución secuencial para comprar CARNE,


ENSALADA y VINO

procedure COMPRAR is
begin
COMPRAR_CARNE;
COMPRAR_ENSALADA;
COMPRAR_VINO;
end;

4
Ejemplo COMPRA (concurrente)
Procedure COMPRAR is
task OBTENER_ENSALADA; •Una tarea se activa
task body OBTENER_ENSALADA is
begin de forma automática
COMPRAR_ENSALADA; al llegar al comienzo
end OBTENER_ENSALADA; del procedimiento.
task OBTENER_VINO;
task body OBTENER_VINO is
begin
•El procedimiento no
COMPRAR_VINO; termina hasta que no
end OBTENER_VINO; terminen todas las tareas
begin
dependientes de él.
COMPRAR_CARNE;
end COMPRAR;

5
La cita

 La cita entre dos tareas se produce como


consecuencia de la llamada de una tarea a un punto
de entrada declarado en otra tarea.
 Se declara en la especificación:
task T is
entry E(…);
end;
 Llamada desde otra tarea:
T.E(…);
 No puede tener un resultado

6
La cita: sentencia accept

 Describe el conjunto de sentencias que se ejecutan


durante la cita
 Se encuentra en el cuerpo de la tarea donde se
declaró el punto de entrada

accept E(…) do
-- conjunto de sentencias
end E;

7
¿Qué ocurre en la cita?

 La tarea que llama al punto de entrada no es la que


ejecuta las sentencias asociadas (las ejecuta la tarea a
la que pertenece el punto de entrada)
 No se ejecuta inmediatamente
task body T1 is task body T2 is
: :
accept E(…) do T1.E(…);
… :
end E; end T2;
:
end T1;
8
Buffer de un único elemento
Task BUFFERING is
entry DEPOSITAR(X: in ITEM);
entry RETIRAR(X: out ITEM);
end;
task body BUFFERING is Llamada:
V: ITEM;
BUFFERING.DEPOSITAR(…);
begin
loop BUFFERING.RETIRAR(…);
accept DEPOSITAR(X: in ITEM) do
V:= X;
end DEPOSITAR;
accept RETIRAR(X: out ITEM) do
X:= V;
end RETIRAR;
end loop;
end BUFFERING

9
Más sobre puntos de entrada
 Cada punto de entrada tiene una cola de tareas que esperan
llamar al punto de entrada.
 Si hay varias tareas llamando a un punto de entrada, éstas serán encoladas.
 La cola puede estar vacía.
 Cada ejecución de la sentencia accept retira una tarea de la cola.

 Puede no tener parámetros:


 entry SENYALAR; -- declaración
 T.SENYALAR; -- llamada

 La sentencia accept no necesita tener cuerpo:


 accept SENYALAR;
 Si una tarea llama a uno se sus puntos de entrada:
 INTERBLOQUEO

10
Sentencia SELECT

Task VAR_PROTEGIDA is loop


entry LEER(X: out ITEM); select
accept LEER(X: out ITEM) do
entry ESCRIBIR(X: in ITEM);
X:= V;
end; end LEER;
task body VAR_PROTEGIDA is or
V: ITEM; accept ESCRIBIR(X: in ITEM) do
begin V:= X;
accept ESCRIBIR(X: in ITEM) do end ESCRIBIR;
V:= X; end select;
end ESCRIBIR; end loop;
end VAR_PROTEGIDA;

11
Condiciones de guarda
loop
Task BUFFERING is select
when CUENTA<N =>
entry DEPOSITAR (X: in ITEM); accept DEPOSITAR(X: in ITEM) do
entry RETIRAR (X: out ITEM); BUF(ENT):= X;
end DEPOSITAR;
end; ENT.= (ENT+1) mod N;
task body BUFFERING is CUENTA:=CUENTA+1;
or
N: constant:= 8; when CUENTA>0 =>
BUFF: array (0..N-1) of ITEM; accept RETIRAR(X: out ITEM) do
X:= BUF(SAL);
ENT,SAL: INTEGER range 0..N-1:=1; end RETIRAR;
SAL:= (SAL+1) mod N;
CUENTA: INTEGER range 0..N:=0; CUENTA:= CUENTA -1;
begin end select;
end loop;
end BUFFERING;

12
Más sobre condiciones de guarda

 Si no existe, la condición del select se considera


como cierta.
 Se vuelven a evaluar en cada comienzo del select.
 No es seguro que se siga cumpliendo cuando se
produzca la cita (por ejemplo si se utilizan variables
globales).
 Se produce un error si ninguna de las guardas es
correcta.

13
Otras formas de SELECT

select select
llamada / accept llamada / accept
else else
conjunto de sentencias delay tiempo;
end select;
conjunto de sentencias
end select;
select
llamada / accept
or
delay tiempo;
conjunto de sentencias
end select;

14

También podría gustarte