Publicado el 15 de Octubre del 2018
686 visualizaciones desde el 15 de Octubre del 2018
154,9 KB
24 paginas
Creado hace 17a (06/11/2007)
ditdit
UPM
Planificación de tareas en
Ada
Juan Antonio de la Puente
DIT/UPM
Características generales
Modelo básico
– planificación con prioridades dinámicas
» también EDF
– políticas de despacho para tareas con la misma prioridad
» FIFO, RR
– políticas de acceso a objetos protegidos
» ICPP / SRP
Perfil de Ravenscar
– FPPS + ICPP
– modelo de tareas estático, ejecución previsible
– se puede analizar el comportamiento temporal
6/11/07
Planificación de tareas en Ada
1
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Prioridades
En el anexo de tiempo real se define un modelo de
planificación con prioridades y desalojo
La prioridad de una tarea es de un subtipo definido en el
paquete System
subtype Any_Priority is Integer range intervalo;
subtype Priority is Any_Priority
range Any_Priority’First .. valor;
subtype Interrupt_Priority is Any_Priority
range Priority’Last + 1 .. Any_Priority’Last;
Los valores mayores denotan prioridades más altas
Debe haber al menos 30 valores de Priority
y 1 de Interrupt_Priority
6/11/07
Planificación de tareas en Ada
2
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Prioridad básica
La prioridad básica de una tarea es la prioridad con la que
se ejecuta inicialmente, si no se dice otra cosa
Se especifica con un pragma Priority
task Controller is
pragma Priority (10);
end Controller;
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
task type Sensor (Task_Priority : System.Priority) is
pragma Priority (Task_Priority);
end Sensor;
La prioridad básica de una tarea se puede cambiar con
Ada.Dynamic_Priorities.Set_Priority
6/11/07
Planificación de tareas en Ada
3
Prioridad activa
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Una tarea puede heredar una prioridad más alta que su
prioridad básica
– durante la activación hereda la prioridad del padre
– durante la ejecución de una operación protegida hereda el techo de
prioridad del objeto protegido
– durante la ejecución de una cita la tarea llamada hereda la prioridad
de la que llama
La prioridad activa de una tarea es el máximo de su
prioridad básica y cualquier prioridad heredada
– esta es la prioridad que se usa para planificar el uso del procesador
6/11/07
Planificación de tareas en Ada
4
Modelo de planificación
Hay una cola de tareas listas
(ready queue) para cada nivel de
prioridad
– es un modelo, no tiene por qué
realizarse exactamente así
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Cuando el procesador está libre se
despacha la primera tarea de la
cola de mayor prioridad que no
esté vacía
Cuando se llega a un punto de
despacho la tarea que está en
ejecución se vuelve a poner en la
cola correspondiente a su prioridad
activa
– por ejemplo, si la tarea se
suspende
other
dispatching
events
running
suspend
ready
…
…
resume
suspended
6/11/07
Planificación de tareas en Ada
5
Políticas de planificación
Definen cómo se hace la planificación en detalle
– cuáles son los puntos de despacho
– cómo se gestionan las colas
El pragma
pragma Task_Dispatching_Policy (policy)
define la política de planificación para todo el sistema
– debe ser una de las siguientes
» FIFO_Within_Priorities
» Non_Preemptive_FIFO_Within_Priorities
» Round_Robin_Within_Priorities
» EDF_Across_Priorities
6/11/07
Planificación de tareas en Ada
6
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Planificación con desalojo
FIFO_within_priorities es una política de planificación con
prioridades fijas y desalojo (FPPS)
Puntos de despacho
– reanudación de una tarea suspendida
» la tarea reanudada se pone al final de la cola correspondiente a su
prioridad activa
– ejecución de un delay que no da lugar a un retardo
» la tarea en ejecución se pone al final de la cola correspondiente a su
prioridad activa
– activación de una tarea con mayor prioridad
» la tarea en ejecución es desalojada y se pone al principio de la cola
correspondiente a su prioridad activa
6/11/07
Planificación de tareas en Ada
7
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Planificación sin desalojo
Non_Preemptive_FIFO_within_priorities es una política de
planificación con prioridades fijas y sin desalojo (FPNS)
Puntos de despacho
– reanudación de una tarea suspendida
» la tarea reanudada se pone al final de la cola correspondiente a su
prioridad activa
– ejecución de un delay que no da lugar a un retardo
» la tarea en ejecución se pone al final de la cola correspondiente a su
prioridad activa
6/11/07
Planificación de tareas en Ada
8
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Turno circular
Round_Robin_Within_Priorities es una política de
planificación en la que se efectúa un turno circular (RR)
entre las tareas de la misma prioridad
Como FIFO_within_priorities, excepto:
– cuando una tarea se pone al final de una cola se le asigna un
presupuesto de tiempo de ejecución igual a un cierto cuanto
» por ejemplo, cuando se reanuda después de estar suspendida
– cuando la tarea se ejecuta, su presupuesto disminuye según el
tiempo de ejecución que consume
– cuando una tarea se pone al principio de una cola mantiene el
presupuesto que le queda
» por ejemplo, cuando se la desaloja
– cuando una tarea ha consumido todo su presupuesto se pone al
final de la cola correspondiente a su nivel de prioridad (y se
despacha otra tarea)
» excepto si está en una operación protegida
6/11/07
Planificación de tareas en Ada
9
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Ada.Dispatching.Round_Robin
with System;
with Ada.Real_Time;
package Ada.Dispatching.Round_Robin is
Default_Quantum : constant Ada.Real_Time.Time_Span
:= implementation-defined;
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
procedure Set_Quantum (Pri : in System.Priority;
Quantum : in Ada.Real_Time.Time_Span);
procedure Set_Quantum (Low, High : in System.Priority;
Quantum : in Ada.Real_Time.Time_Span);
function Actual_Quantum (Pri : System.Priority)
return Ada.Real_Time.Time_Span;
function Is_Round_Robin (Pri : System.Priority) return Boolean;
end Ada.Dispatching.Round_Robin;
6/11/07
Planificación de tareas en Ada
10
Primero el más urgente
EDF_Across_Priorities es una política de planificación
basada en plazos
El plazo de respuesta de una tarea se especifica con
pragma Relative_Deadline (plazo)
El plazo es una expresión de tipo Ada.Real_Time.Time_Span
Cada tarea tiene una prioridad y un plazo relativo
– cuando está activa tiene, además, un plazo absoluto
Se despacha primero la tarea cuyo plazo absoluto es
menor, independientemente de su prioridad
6/11/07
Planificación de tareas en Ada
11
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Ada.Dispatching.EDF
with Ada.Real_Time;
with Ada.Task_Identification;
package Ada.Dispatching.EDF is
subtype Deadline is Ada.Real_Time.Time;
Default_Deadline : constant Deadline := Ada.Real_Time.Time_Last;
procedure Set_Deadline (
D : in Deadline;
T : in Ada.Task_Identification.Task_Id
:= Ada.Task_Identification.Current_Task);
procedure Delay_Until_And_Set_Deadline (
Delay_Until_Time : in Ada.Real_Time.Time;
Deadline_Offset : in Ada.Real_Time.Time_Span);
function Get_Deadline (
T : in Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task)
return Deadline;
end Ada.Dispatching.EDF;
6/11/07
Planificación de tareas en Ada
12
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Ejemplo (1)
-- gnat.adc:
-- pragma Task_Dispatching_Policy (EDF_Across_Priorities);
with Ada.Real_Time;
package Deadline_Driven is
use Ada.Real_Time;
Deadline : constant Time_Span := Milliseconds (4);
task Periodic is
pragma Relative_Deadline (Deadline);
end Periodic;
end Deadline_Driven;
6/11/07
Planificación de tareas en Ada
13
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Ejemplo (2)
with Ada.Real_Time;
with Ada.Dispatching.EDF;
package body Deadline_Driven is
use Ada.Real_Time, Ada.Dispatching.EDF;
task body Periodic is
Period : constant Time_Span := Milliseconds (20);
Next : Time := Clock;
begin
loop
Delay_Until_And_Set_Deadline (Next, Deadline);
-- actividad periódica
Next := Next + Period;
end loop;
end Periodic;
end Deadline_Driven;
6/11/07
Planificación de tareas en Ada
14
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
Techo de prioridad
La prioridad activa de las tareas que ejecutan operaciones
protegidas depende de la política de planificación y de la
política de acceso a los objetos protegidos
6
0
0
2
-
5
0
0
2
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
La política de acceso con techos de prioridad (ceiling
locking) está definida para todas las políticas de
planificación predefinidas
– con FIFO_Within_Priorities equivale al protocolo del techo de
prioridad inmediato
– con EDF_Across_Priorities equivale al protocolo SRP (stack
resource protocol)
6/11/07
Planificación de tareas en Ada
15
Prioridad techo
Para usar techos de prioridad hay que poner un pragma
de configuración
pragma Locking_Policy (Ceiling_Locking);
6
0
0
2
-
5
0
0
2
– afecta a todo el programa (con GNAT se pone en gnat.adc)
t
e
n
e
u
P
a
l
e
d
i
o
n
o
t
n
A
n
a
u
J
©
El techo de prioridad de un objeto o un tipo protegido se
especif
Comentarios de: Planificación de tareas en Ada (0)
No hay comentarios