Concurrencia en Ada - PowerPoint PPT Presentation

1 / 56
About This Presentation
Title:

Concurrencia en Ada

Description:

La cita (rendez-vous) ... La cita entre dos tareas se produce como consecuencia de la llamada de una tarea ... conjunto de sentencias que se ejecutar n en la cita ... – PowerPoint PPT presentation

Number of Views:106
Avg rating:3.0/5.0
Slides: 57
Provided by: xxx997
Category:
Tags: ada | cita | concurrencia

less

Transcript and Presenter's Notes

Title: Concurrencia en Ada


1
Concurrencia en Ada
2
Tareas
  • En Ada, las actividades concurrentes se describen
    por medio de tareas
  • La forma de expresar una tarea en Ada es similar
    a los paquetes

task T is --especificación end T task body T
is --cuerpo end T
3
Tareas
  • Cada tarea consta de
  • Una especificación que describe la interfaz que
    presenta a otras tareas
  • Un cuerpo que describe el comportamiento dinámico
    de la tarea
  • En algunos casos una tarea no presenta interfaz a
    otras tareas

task T task body T is --cuerpo end T
task T is --especificación end T task body T
is --cuerpo end T
4
Tareas
  • Declaración
  • Activación
  • Terminación

5
Declaración de tareas
  • Una tarea es un componente de programa que puede
    declararse dentro de
  • subprogramas, bloques, paquetes o dentro del
    cuerpo de otra tarea

6
Ejemplo
  • Arreglos en una casa colocar pisos, colocar
    molduras, colocar cocina

7
Ejemplo
procedure ARREGLAR_CASA is task ALBAÑIL
task body ALBAÑIL is begin
COLOCAR_PISOS end ALBAÑIL task YESISTA
task body YESISTA is begin
COLACAR_MOLDURAS end YESISTA task
MONTADOR task body MONTADOR is
COLOCAR_COCINA end MONTADOR begin
SUPERVISAR_TRABAJOS end ARREGLAR_CASA
procedure ARREGLAR_CASA is COLOCAR_PISOS
COLACAR_MOLDURAS COLOCAR_COCINA
SUPERVISAR_TRABAJOS end ARREGLAR_CASA
8
Activación de tareas
  • La ejecución de una tarea puede entenderse como
    un proceso que consta de dos fases
  • La primera fase, conocida como activación,
    consiste en la elaboración de las declaraciones
    del cuerpo de la tarea
  • La segunda fase consiste por supuesto en la
    ejecución de sus sentencias
  • La activación de una tarea es automática
  • Las tareas subordinadas se activan
    automáticamente cuando la unidad progenitora
    llega al begin siguiente a la declaración de las
    tareas

9
Activación de tareas
  • Cuando una tarea se declara en un paquete, su
    activación se produce en el begin del cuerpo del
    paquete

10
Activación de tareas
procedure ARREGLAR_CASA is task ALBAÑIL
task body ALBAÑIL is begin
COLOCAR_PISOS end ALBAÑIL task YESISTA
task body YESISTA is begin
COLACAR_MOLDURAS end YESISTA task
MONTADOR task body MONTADOR is
COLOCAR_COCINA end MONTADOR begin
SUPERVISAR_TRABAJOS end ARREGLAR_CASA
  • Activación de las tareas albañil, yesista y
    montador
  • Un vez activadas la tareas existirán 4 tareas
    ejecutándose concurrentemente

11
Terminación de tareas
  • Las tareas terminan cuando llegan a su end
    final
  • Regla importante
  • Una unidad no puede acabar hasta que todas las
    tareas dependientes de ella hayan terminado

12
Terminación de tareas
  • En general podemos decir que la terminación se
    realiza en dos etapas
  • Diremos que una unidad se completa cuando llega a
    su end final
  • y finalmente terminará sólo cuando todas las
    tareas dependientes, si las hay, hayan terminado
    también

13
Ejemplo
procedure PRINCIPAL is --declaraciones ...
task A task body A is begin ...
end A task B task body B is begin
... end B begin ... end PRINCIPAL
14
La cita (rendez-vous)
  • Generalmente las tareas interaccionarán entre sí
    durante su tiempo de vida.
  • Esto se hace en Ada mediante un mecanismo
    conocido como la cita o rendez-vous (que
    significa sincronización e intercambio de
    información entre dos tareas dadas)

15
Puntos de entrada
  • 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 un punto de entrada en la
    especificación de una tarea de la misma manera
    que se declara un procedimiento en la
    especificación de un paquete

task EJEMPLO is entry SIN_PARAMETROS entry
CON_PARAMETROS(Ain INTEGERBout FLOAT Cin out
BOOLEAN) private entry ..... end EJEMPLO
16
Puntos de entrada
  • Un punto de entrada puede tener parámetros in,
    out e in out
  • Los parámetros son el medio para el intercambio
    de información entre las tareas que se den en la
    cita
  • Si en la declaración de un punto de entrada no
    hay parámetros significa que estamos utilizando
    el punto de entrada únicamente para
    sincronización entre tareas

17
Sentencias accept
  • Las sentencias que se ejecutarán durante una cita
    se describen mediante las sentencias accept
    correspondientes
  • Las sentencias accept se encuentran en el cuerpo
    de la tarea que contiene la declaración del punto
    de entrada correspondiente

task body EJEMPLO is begin ... accept
SIN_PARAMETROS do --conjunto de sentencias
que se ejecutarán en la cita
--correspondiente al punto de entrada
SIN_PARAMETROS exception end
SIN_PARAMETROS ... accept
CON_PARAMETROS(Ain INTEGERBout FLOATCin out
BOOLEAN) do --conjunto de sentencias que se
ejecutarán en la cita --correspondiente al
punto de entrada CON_PARAMETROS end
CON_PARAMETROS end A
18
Vista completa
task EJEMPLO is entry SIN_PARAMETROS entry
CON_PARAMETROS(Ain INTEGERBout FLOAT Cin out
BOOLEAN) end EJEMPLO task body EJEMPLO
is begin ... accept SIN_PARAMETROS do
--conjunto de sentencias que se ejecutarán en la
cita --correspondiente al punto de entrada
SIN_PARAMETROS end SIN_PARAMETROS ...
accept CON_PARAMETROS(Ain INTEGERBout
FLOATCin out BOOLEAN) do --conjunto de
sentencias que se ejecutarán en la cita
--correspondiente al punto de entrada
CON_PARAMETROS end CON_PARAMETROS ... end
A
19
Llamada a un punto de entrada
  • Se llama a un punto de entrada de la misma forma
    que a un procedimiento

... EJEMPLO.SIN_PARAMETROS ... EJEMPLO.CON_PARAME
TROS(a,b,c) ...
20
La cita o rendes-vous
task PEON is entry PREPARAR_MEZCLA(cantidadin
INTEGER) end PEON task body PEON is begin
loop --Peón haciendo otros trabajos
... accept PREPARAR_MEZCLA(cantidad in
INTEGER) do --prepara la mezcla
... -mezcla preparada end
PREPARAR_MEZCLA end loop end PEON
task ALBAÑIL task body ALBAÑIL is cantidad
integer begin loop --Trabajando
... PEON.PREPARAR_MEZCLA(cantidad)
... end loop end ALBAÑIL
21
Atributo COUNT
  • El atributo ECOUNT da el número de tareas que
    están en un momento determinado en la cola del
    punto de entrada E
  • OJO al uso del atributo COUNT en las guardas !
  • Da el número de tareas encoladas en el momento en
    que la guarda se evalúa, y este puede cambiar
    antes de que se acepte la cita

22
Temporización
  • delay segundos
  • Suspende la tarea al menos segundos segundos
  • Si segundoslt0, no tiene efecto
  • segundos Tipo Duration (coma fija)
  • Rango de valores
  • Depende de la implementación
  • Garantizan
  • Precisión (Durationsmall) no por encima de 20
    milisegundos
  • Rango al menos 86_400.0 a 86_400.0 (segundos de
    un día)

23
Temporización
  • delay until tiempo
  • Tiempo Tipo Time
  • Fecha
  • Hora (segundos transcurridos desde la media
    noche)
  • Más operaciones
  • paquete Ada.Calendar
  • paquete Ada.Real_Time

24
Ada.Calendar
package Ada.Calendar is type Time is private
subtype Year_Number is integer range
1901..2099 subtype Month_Number is integer
range 1..12 subtype Day_Number is integer
range 1..31 subtype Day_Duration is duration
range 0.0..86_400.0 function Clock return
Time function Year(DateTime) return
Year_Number function Month(DateTime) return
Month_Number function Day(DateTime) return
Day_Number function Second(DateTime) return
Day_Duration procedure Split(Date in Time
Year out Year_Number
Month out Month_Number
Day out Day_Number Seconds
out Day_Duration)
25
Ada.Calendar
function Time_Of(Year Year_Number
Month Month_Number Day
Day_Number Seconds
Day_Duration) return Time function (Left
TimeRight Duration) return Time function
(Left Duration Right Time) return Time
function -(Left TimeRight Duration) return
Time function -(Left Time Right Time)
return Duration funciton lt(Left,Right Time)
return Boolean function lt(Left,Right Time)
return Boolean function gt(Left,Right Time)
return Boolean function gt(Left,Right Time)
return Boolean Time_Error exception
private --implementation dependent end
Ada.Calendar
26
Sentencia Select
select accept A(X out item) do
--sentencias end --más sentencias or
accept B(Xin item) do --sentencias
end --más sentencias or ... end select
27
Sentencia Select (con guardas)
  • OJO! No es seguro que una guarda esté todavía a
    cierto cuando se realice la cita correspondiente
  • Si todas las guardas son falsas se eleva la
    excepción PROGRAM_ERROR
  • Si una guarda no existe se considera como cierta

select when condicion gt accept A(X out
item) do --sentencias end --más
sentencias or when condicion gt accept
B(Xin item) do --sentencias end
--más sentencias or ... end select
28
Sentencia Select (con delay)
select when condicion gt accept A(X out
item) do --sentencias end --más
sentencias or ... or ... or when
condicion gt delay 10MINUTOS end select
29
Sentencia Select (con else)
  • Una sentencia select no puede tener una rama
    else y otra delay (aunque la rama else si puede
    empezar con una sentencia delay)
  • Las sentencias accept pueden ir guardadas salvo
    la rama else

select when condicion gt accept A(X out
item) do --sentencias end --más
sentencias or ... or ... else
--sentencias end select
30
Llamada temporizada
  • La sentencia select sólo puede tener una llamada
    a un punto de entrada y sin guarda

select Peon.Preparar_Mezcla(cantidad) or
delay 1MINUTE --HAGO OTRAS COSAS Y ME OLVIDO
--DE LA MEZCLA end select
31
Llamada condicional
  • La sentencia select sólo puede tener una llamada
    a un punto de entrada y sin guarda

select Peon.Preparar_Mezcla(cantidad) else
--HAGO OTRAS COSAS Y ME OLVIDO --DE LA
MEZCLA end select
32
Tipos Tarea
procedure principal is task type T is
--especificación entry E(...) end T
task body T is --cuerpo end T XT
vector array(1..10) of T type REC is
record CTT ... end record
YREC type REF_T is access T RX
REF_T --otras declaraciones begin X.E(...)
vector(I).E(...) Y.CT.E(...) RXnew T
RX.E(...) end principal
33
Dependencia y terminación
  • Una unidad no puede acabar hasta que todas las
    tareas dependientes de ella hayan terminado
  • Toda tarea depende de una unidad
  • Bloque, subprograma o cuerpo de tarea que la
    engloba y dentro del cual se declara, salvo
  • Declaración de tareas en paquetes
  • Tareas creadas con el operador new

34
Dependencia
  • Declaración de tareas en paquetes
  • Dependerán del bloque, subprograma o cuerpo de
    tarea donde se declare el paquete
  • Tareas creadas con el operador new
  • Dependerán del bloque, subprograma o cuerpo de
    tarea donde se declaró el tipo acceso

35
Terminación
task type progenitora task body progenitora is
task type T task body T is loop
--cuerpo end loop end T tareaT begin
... end progenitora
  • Cuándo termina la tarea progenitora ?
  • Select con alternativa terminate

36
Terminación
  • Se toma la alternativa terminate si la unidad de
    la que la tarea depende ha llegado al final, y
    por tanto, está completada
  • y además todas las tareas hermanas y tareas
    dependientes han terminado o pueden análogamente
    seleccionar una alternativa terminate

select ... or ... or terminate end select
  • Puede estar guardada, pero no puede aparecer en
    una sentencia select que tenga una alternativa
    delay o else

37
Terminación
  • La selección de una sentencia alternativa
    terminate se entiende como una terminación normal
  • La tarea controla la situación y termina
    voluntariamente
  • La sentencia abort termina una o más tareas
    incondicionalmente

38
Terminación
  • Si se aborta una tarea, entonces todas las tareas
    que dependen de ella, o de un subprograma o
    bloque llamados en ese momento por ella, se
    abortan también

39
Terminación
  • Situaciones
  • Tarea suspendida
  • No suspendida
  • Caso especial Se intenta abortar una tarea
    durante una cita
  • tarea llamada -gt TASKING_ERROR
  • tarea llamante -gt se completa la cita (la tarea
    permanece en un estado anormal y solo cuando se
    completa la cita, la tarea se completa
    debidamente)

40
Estado de una tarea
  • TTERMINATED
  • Cierto si T ha terminado
  • TCALLABLE
  • Cierto a menos que la tarea se haya completado o
    terminado o se encuentre en un estado anormal
    pendiente de que la aborten

41
TASKING_ERROR
  • Error durante la activación de alguna tarea
  • TASKING _ERRROR en la unidad progenitora
  • Aborta una tarea llamada durante una cita
  • TASKING_ERROR en la tarea llamante
  • Tareas encoladas en puntos de entrada de una
    tarea servidora que es abortada
  • TASKING_ERROR en las tareas encoladas

42
Otras situaciones de error
  • Si se produce una excepción durante una cita en
    la tarea llamada y no se maneja dicha excepción
    en el accept correspondiente, se propaga la
    excepción en ambas tareas
  • Si una tarea no maneja una excepción de ninguna
    manera, se abandona la tarea y se pierde la
    excepción

43
Objetos protegidos
protected type OBJETO is function XXX(params)
return tipo procedure YYY(params) entry
ZZZ(params) private --datos privados --otras
funciones, procedimientos y --puntos de
entrada privados end OBJETO protected body
OBJETO is --cuerpo (implementación) --A
diferencia de los paquetes y tareas --en esta
parte no se pueden declarar --datos end OBJETO
44
Discriminantes
protected type OBJETO(tamañointeger100) is
... end OBJETO protected body OBJETO is
... end OBJETO
task type T(tamañointeger100) is ... end
T task body T is ... end T
45
Objetos protegidos (OP)
  • Los objetos protegidos garantizan exclusión mutua
    en las diferentes llamadas a sus operaciones
    protegidas (funciones, procedimientos, puntos de
    entrada)
  • Funciones sólo tienen permiso de lectura sobre
    los datos privados
  • Acceso concurrente a un objeto protegido

46
Operaciones protegidas
protected body OBJETO is procedure YYY(...) is
--declaraciones begin ... end YYY
function XXX return tipo begin ... end
XXX entry ZZZ(...) when condicion is begin
... end ZZZ end OBJETO
47
Acceso a objetos protegidos
Tareas esperando fuera del OP
Tareas esperando en las barreras asociadas a los
puntos de entrada
Una tarea dentro del OP
entry 1
. . .
entry N
48
Condiciones barrera
  • Uso del atributo COUNT
  • Llamadas temporizadas y condicionales
  • Tareas
  • Problemas puede ocurrir que entre la evaluación
    de la condición y la cita, la condición haya
    cambiado
  • Objetos protegidos
  • No es posible estas situaciones erróneas
  • La operación de quitar una tarea de una cola es
    una operación protegida. Por tanto, esto
    provocará que se reevalúen las condiciones

49
Requeue
  • requeue punto de entrada
  • Encola una tarea en un punto de entrada de
  • la misma tarea
  • otra tarea
  • un objeto protegido
  • Pasa implícitamente los parámetros de la llamada
    original
  • No pueden pasarse parámetros explícitamente
  • No se puede abortar a una tarea que realice un
    operación requeue, salvo
  • requeue punto de entrada with abort

50
Ejemplo
protected Event is entry wait entry
signal private entry reset
OcurredbooleanFalse end Event protected
body Event is entry wait when Ocurred is
begin null end wait
entry signal when True is begin if
waitcountgt0 then OcurredTrue
Requeue reset end if end signal
entry reset when waitcount0 is begin
OcurredFalse end reset end Event
51
Excepciones
  • Una excepción durante una operación protegida no
    manejada localmente se propaga a la tarea llamada

52
Select asíncrono(Asyncronous Transfer Control-
ATC)
  • Permite abandonar una actividad bajo determinadas
    circunstancias, pudiéndose ejecutar en ese caso
    un conjunto alternativo se sentencias

select --delay 5.0 --o Llamada a un punto de
entrada --sentencias alternativas then abort
--otras sentencias end select
Sentencias alternativas
1
Parte que se puede abortar
2
53
Ejemplo cálculo iterativo
protected Result is procedure Set_Estimate(Xin
Data) function Get_Estimate return
Data private The_EstimateData end
protected Trigger is entry wait procedure
signal private FlagBooleanFalse end
Tarea esclava
Tarea controladora
... select Trigger.wait then abort --Obtener
una estimación nueva_est Result.Set_Estimate(nue
va_est) end select ...
... Trigger.signal Final_AnswerResult.Get_Estim
ate ...
54
Familia de puntos de entradas. Tareas
type peticion is integer range 1..3 task
Servidor is entry Sevir(peticion)(params) end
Servidor task body Servidor is begin loop
select when guarda1 gt accept
Servir(1)(params) do ... end
Servir or when guarda2 gt accept
Servir(2)(params) do ... end
Servir or
when guarda3 gt accept
Servir(3)(params) do ... end
Servir end select end loop end Servidor

55
Familia de puntos de entradas. Tareas
type peticion is integer range 1..3 task
Servidor is entry Sevir(peticion)(params) end
Servidor task body Servidor is begin loop
for P in peticion loop select
accept Servir(p)(params) do ...
end Servir exit else
null end select end loop end
loop end Servidor
56
Familia de puntos de entradas. Objetos protegidos
type peticion is integer range 1..3 protected
Servidor is entry Sevir(peticion)(params) end
Servidor protected body Servidor is function
Condicion(Ppeticion) return boolean is begin
... end Condicion entry Servir(for P in
peticion)(params) when Condicion(P) is begin
Accion(params) end Servir end Servidor
Write a Comment
User Comments (0)
About PowerShow.com