Vous êtes sur la page 1sur 32

Systèmes d’exploitation embarqués et temps-réel

Chapitre 2 : Ordonnancement temps-réel

Aimen Bouchhima

2021-2022
Plan

Modèle de tâche temps-réel

Ordonnancement temps-réel
Définition
Classification des ordonnanceurs
Ordonnaceur Cyclique

Ordonnaceur à priorité fixe

2 / 33
Processus/Thread/Tâche

I Un processus est un programme en exécution (instance de


programme)
I Un Thread (processus léger) est un chemin d’exécution (flow
of execution) dans un processus
I Une tâche : Processus ou Thread

3 / 33
Modèle de tâche temps-réel

I Une tâche temps-réel τi est une séquences d’actions Ji,k


I Une action Ji,k = (ri,k , ci,k , di,k ) :
I arrive à l’instant ri,k (instant d’activation)
I execute pendant une durée ci,k
I se termine à l’instant fi,k
I doit se terminer avant l’échéance absolue di,k (deadline)

c i,k
ri,k fi,k di,k

I Temps de réponse d’une activité Ji,k : ρi,k = fi,k − ri,k

4 / 33
Tâche périodique

I Une tâche périodique τi = (Ci , Di , Ti ) est une séquences


d’actions Ji,k avec
I ri,k+1 = ri,k + Ti
I di,k+1 = ri,k + Di
I Ci = max(ci,k )
I Ti est la période de la tâche et Di son échéance relative
I Ci est le temps d’exécution au pire cas (WCET)
I Ri : temps de réponse au pire cas :
Ri = max(ρi,k ) = max(fi,k − ri,k )
I Une tâche qui respecte son échéance doit vérifier : Ri 6 Di

5 / 33
Tâche périodique : exemple
I Une tâche périodique à une structure régulière
I s’active périodiquement (chaque Ti )
I effctue un traitement
I se bloque en attendant la prochaine activation

void * PeriodicTask(void * arg)


{
<initialization>;
<start periodic timer, period = T>;
while (1) {
<read sensors>;
<update outputs>;
<update state variables>;
<wait next activation>;
}
}

6 / 33
Tâche périodique : représentation graphique

I Les tâches sont représentées graphiquement par un


diagramme d’ordonnancement
I Exemple : tâche périodique τ1 = (3, 6, 8)
I Ci = 3, Di = 6, Ti = 8

τ1

0 2 4 6 8 10 12 14 16 18 20 22 24

I Remarque : les actions J1,1 et J1,3 exécutent pendant 3 unités


de temps (WCET), alors que J1,2 consomme 2 unités de temps

7 / 33
Tâche apériodique
I Une tâche apériodique n’est pas caractérisée par une période
I Le temps entre deux activations successives n’est pas connu à
l’avance
I On ne peut même pas garantir un temps minimal entre deux
activations successives
I Les tâches apériodiques peuvent modéliser
I La réponse à des évènements rares et imprévisibles qui
proviennet de l’environnement
I La réponse à des évènements irréguliers (exemple des paquets
venants du réseau)

τ1

0 2 4 6 8 10 12 14 16 18 20 22 24

8 / 33
Tâche sporadique

I Tâche apériodique avec un temps minimal entre deux


activations successives
I Une tâche sporadique est modélisée comme une tâche
périodique τi = (Ci , Di , Ti )
I Ti : le temps minimal inter-arrivés (minimum interarrival time)
I Exemple τ1 = (2, 5, 9)

τ1

0 2 4 6 8 10 12 14 16 18 20 22 24 26

9 / 33
Criticité d’une tâche

I Une échéance est ferme (hard), si le dépassement de cette


échéance provoque une défaillance critique du système
I Une tâche est dite temps-réel ferme (ou dûr) si tous ses
échéances sont fermes (∀j, ρi,j ≤ Di,j ⇒ Ri ≤ Di )
I Une échéance est souple (soft), si le dépassement de cette
échéance provoque une dégradation de la qualité de service
(QoS), mais pas la défaillance du système
I Une tâche est dite temps-réel souple si elle a une échéance
souple

10 / 33
Exemples

I Temps-réel ferme : un contrôleur de robot mobile doit


détecter les obstacles et répondre dans un délai qui dépend de
sa vitesse, autrement, le robot heurtera les obstacles
I Temps-réel souple : Lecteur vidéo
I fps = 25 ⇒ délai pour traiter une image (frame) = 40ms
I Si une image est affichée un peu en retard, l’utilisateur ne
s’apercevra même pas de la dégradation de la qualité de service
I Mais si le taux d’images affichées avec retard ou supprimées
dépasse un certain seuil, ça deviendra gênant pour l’utilisateur
I Dans tous les cas, temps-réel souple ne signifie pas absence
d’échéance.

11 / 33
Définition d’un ordonnanceur

I Un ordonnanceur est un composant du système d’exploitation


qui implémente un algorithme permettant de dispatcher
l’ensemble des tâches τ sur l’ensemble des processeurs
physiquement disponibles dans la machine
I Formellement, un ordonnanceur pour une architecture
contenant m processeurs implémente σ(t), une fonction qui à
chaque instant t associe un vecteur de tâches
σ : t → (τ ∪ τidle )m
I τidle : tâche particulière idle qui, lorsqu’elle ”s’exécute” sur un
processeur, celui-ci devient en mode ”idle”
I Cas m = 1 (Uni-processeur) : σ : t → τ ∪ τidle

12 / 33
Architecture matérielle
I Dans la suite du cours, on distingue le cas uni-processeur (UP)
et le cas multi-processeur (Symetrical MultiProcessors SMP)
I L’architecture SMP est un cas particulier de MIMD (Multiple
Instruction Multiple Data) dans laquelle la mémoire est
accessible par tous les processeurs d’une façon uniforme

Processor Processor Processor ... Processor

Cache* Cache Cache ... Cache

Bus Interconnection

Memory I/O Memory I/O

Architecture UP Architecture SMP

13 / 33
Ordonnanceur Préemptif Vs Coopératif

Un ordonnanceur est dit préemptif s’il a le pouvoir d’interrompre


une tâche lorsque celle-ci est en cours d’exécution. Dans le cas
contraire, l’ordonnaceur est dit non-préemptif ou coopératif
I En pratique, l’implémentation de la préemption se fait via
l’interruption matérielle
I Suite à une interruption matérielle, le processeurs interrompt
l’exécution de la tâche (mais termine l’instruction en cours
comme même) pour se brancher à une adresse fixe dans la
mémoire instruction (routine de gestion d’interruption ou ISR)
I L’ISR fait partie du code du système d’exploitation
I A partir de là, l’ordonnanceur récupère la main ...
I Un ordonnaceur coopératif doit attendre que la tâche rend la
main explicitement (soit elle se termine soit elle fait un appel
système qui peut être simplement ”passer la main” ou yield)

14 / 33
Ordonnanceur Statique Vs Dynamique

I Ordonnancement statique appelé aussi ordonnacement hors


ligne (offline)
I Le choix des tâches à exécuter se fait, à l’avance, par le
concepteur du système.
I Non préemptif : chaque tâche est exécutée jusqu’à terminaison
I Ordonnaceur simple : il consulte, à des points précis sur l’axe
temps, une table (planning) qui contient la tâche à exécuter à
cet instant précis
I Ordonnancement dynamique appelé aussi ordonnacement en
ligne (online)
I Pas de planification en avance des tâches.
I L’ordonnaceur se base sur l’information disponible à un instant
donné (ensemble des tâches actives plus éventuellement des
méta-données associées comme les priorités des tâches) pour
prendre la décision adéquate (politique d’ordonnancement).

15 / 33
Ordonnaceur Cyclique

I Cas particulier d’ordonnancement statique pour tâches


périodiques
I Idée :
I Calculer le pgcd (Cycle mineur ∆) et le ppcm (Cycle majeur
T ) de toutes le tâches
I L’axe de temps est divisé en créneaux égaux au cycle mineur
I Les créneaux sont statiquement alloués aux tâches (via le
planning) sur toute la période d’un cycle majeur
I Un timer matériel interrompt le système périodiquement à
chaque créneau

16 / 33
Ordonnaceur Cyclique : exemple
On considère trois tâches périodiques τ1 , τ2 et τ3 à échéance sur
requête (Di = Ti )

Créneau Tâches
Tâche Ci (ms) Ti (ms)
1 {τ1 , τ3 }
τ1 10 25
⇒ 2 {τ1 , τ2 }
τ2 5 50
3 {τ1 }
τ3 13 100
4 {τ1 , τ2 }
∆ = 25, T = 100
Plannning

∆ T

25 50 75 100 125 150 175 200

17 / 33
Ordonnaceur Cyclique : Implémentation
I Exemple : implémentation sur micro-contrôleur

I Chaque tâche effectue la séquence suivante : mettre un pin


GPIO à 1, faire un traitement puis remet le pin à 0

// Declare global variable schedule

void * SysTick_ISR() void * Task1(void * arg)


{ {
} GPIO_ResetBits(GPIOA, GPIO_Pin_0);
for (i=0; i<N1; i++) {
int main() // consume some cycles to
{ // simulate computation time
//(1) Enable clock for // of task 1 (adjust N1
//GPIOA and configure pins // accordingly)
//(2) start SysTick Timer }
while (1) { GPIO_SetBits(GPIOA, GPIO_Pin_0);
// Equivalent to Idle task }
}
}

18 / 33
Ordonnaceur Cyclique : Avantages et Inconvénient

I Avantages
I Implémentation simple
I Simple appels de fonction
I Système d’exploitation non nécessaire
I Pas besoin de protéger les resources partagées par des mutex,
sémaphores,...
I Surcoût minimal lors de l’exécution (taille mémoire et latences)
I Plus facile à tester et valider (utilisé dans les systèmes
critiques)
I Inconvénients
I Implémentation simple
I Le temps d’exécution des tâche doit être connu avec précision
I Que se passe si une tâche n’arrive pas à terminer son
traı̂tement avant l’interruption TIMER ?
I Difficulté de gérer les tâches apériodiques et sporadiques

19 / 33
Ordonnaceur à priorité fixe

I Cas particulier d’ordonnancement dynamique


I Ordonnancement préemptif
I Principe simple :
I Chaque tâche τi possède une priorité fixe pi
I A tout moment, La tâche active ayant la priorité la plus élevé
est exécutée
I Dans les deux exemples suivant, on considère des tâches
périodiques à temps d’exécution constant et à échéance sur
requête

20 / 33
Exemples d’ordonnancement
I Exemple 1

Tâche Ci Ti pi
τ1 2 6 3
τ2 2 9 2
τ3 3 12 1

τ1

τ2

préemption
τ3

0 2 4 6 8 10 12 14 16 18 20 22 24

I Pas de dépassement d’échéance ⇒ ordonnançable


21 / 33
Exemples d’ordonnancement
I Exemple 2 (non ordonnançable)

Tâche Ci Ti pi
τ1 2 6 1
τ2 2 9 2
τ3 3 12 3

τ3

τ2

τ1

0 2 4 6 8 10 12 14 16 18 20 22 24

I La tâche τ1 a dépassé son échéance ⇒ non ordonnançable


22 / 33
Comment fixer les priorités ?

I L’affectation des priorités au tâches peut influencer


l’ordonnançabilité des ces tâches
I Problème : comment affecter les priorités pour que les tâches
soient ordonnaçables ?
I Objectif : Trouver une affectation optimale Opt des priorités
pour un ensemble de tâches τ telque:
I Si τ est ordonnançable par une autre affectation de priorité,
alors il est ordonnançable par Opt
I Si τ n’est ordonnançable par Opt, alors il ne l’ai pas pour
toutes autres affectations de priorité

23 / 33
Affectation optimale des priorités

I Etant donné un ensemble de tâches périodiques à échéances


sur requêtes (Di = Ti ) et avec un décalage égale à zéro
(ri,0 = 0)
I L’affectation optimale des priorités est celle appelé ”Rate
Monotonic” (RM)
I Plus la période est petite → plus la priorité est élevée
I Etant donné un ensemble de tâches périodiques avec un
décalage égale à zéro (ri,0 = 0)
I L’affectation optimale des priorités est celle appelé ”Deadline
Monotonic” (DM)
I Plus l’échéance relative est petite → plus la priorité est élevée
I RM est un cas particulier de DM

24 / 33
Exercice

I On considère l’ensemble des tâches:

Ci Di Ti
τ1 3 6 6
τ2 2 4 8
τ3 2 12 12

0 2 4 6 8 10 12 14 16 18 20 22 24

I Proposer un ordonnancement optimal avec priorités fixes


I Est ce que le système est ordonnançable ? discuter.

25 / 33
Exercice (correction)

τ2

τ1

τ3

0 2 4 6 8 10 12 14 16 18 20 22 24

26 / 33
Test d’ordonnançabilité

I Comment affirmer qu’un ensemble de tâches ordonnancées


selon RM/DM est ordonnançable ou non ?
I Méthode 1 : Simuler l’exécution des tâches à la main sur une
période de test Tanalyse suffisante (voir exercice précédent)
I Tâches sans décalage (ri,0 = 0) :
Tanalyse = ppcm(Ti ) = CycleMajeur = T
I Tâches avec décalage (ri,0 6= 0) :
Tanalyse = 2T + max(ri,0 )
I Méthode 2 : Test basé sur le seuil limite d’utilisation du
processeur
I Test suffisant mais pas nécessaire
I Méthode 3 : Test basé le temps de réponse
I Test nécessaire et suffisant qui peut être automatisé par un
algorithme

27 / 33
Méthode 2 : Test basé sur l’utilisation du processeur
I On se place dans le cas monoprocesseur (UP)
I Chaque tâche utilise le processeur pendant une fraction Ui
Ci
Ui = T i
I l’utilisation totale du processeur U (charge du processeur)
P P Ci
U = Ui = Ti
I Si U > 1, alors sûrement l’ensemble de tâches n’est pas
ordonnançable
I Si U ≤ 1, l’ensemble de tâches peut être ordonnançable ou
non
I Etant donnée un algorithme d’ordonnancement, il existe un
seuil minimal limite d’utilisation du processeur Ulub (Least
Upper Bound) au dessous duquel on peut affirmer
l’ordonnançabilité
U ≤ Ulub ⇒ Ordonnançable

28 / 33
Méthode 2 : Test basé sur l’utilisation du processeur

I Etant données n tâches périodiques ordonnancées par RM :


1
I Ulub = n(2 n − 1)
I Ulub est une fonction décroissante de n

n Ulub
2 0.828
3 0.779
4 0.756
5 0.743
6 0.734
... ...
∞ 0.69

29 / 33
Méthode 2 : Test basé sur l’utilisation du processeur

I Ainsi, pour RM, le test rapide d’ordonnançabilité consiste à :


P Ci
I Calculer U = Ti
I Si U ≤ Ulub , alors les tâches sont ordonnançables
I Si U > 1, alors les tâches ne sont pas ordonnançables
I Si Ulub < U ≤ 1, alors il faut pousser l’analyse avec la
méthode 1 ou la méthode 3
I Pour DM, la même démarche s’applique, mais en prenant
P Ci
U= Di
I Pour le voir, il suffit de raisonner sur le même ensemble de
tâche τ 0 mais avec Ti0 = Di
I le nouveau système τ 0 peut être vu comme un ”pire cas” du
système original
I Si τ 0 est ordonnançable (en utilisant RM) ⇒ Le système
original est ordonnaçable

30 / 33
Méthode 3 : analyse des temps de réponses

I Rappel : Une tâche qui respecte son échéance doit vérifier :


Ri 6 Di , avec Ri le temps de réponse de la tâche
I Le temps de réponse d’une tâche dépond :
I de son propre temps d’exécution
I des temps d’exécution de toutes les tâches de plus fortes
priorités
I le temps de réponse d’une tâche :
X Ri 
R i = Ci + Cj = F (Ri )
Tj
j>i

I Ri est le plus petit point fixe de la fonction monotone F

31 / 33
Méthode 3 : analyse des temps de réponses

I Solution algorithmique:
I W0 = Ci
I W1 = F (W0 )
I W2 = F (W1 )
I ...
I Wk+1 = F (Wk )
I On s’arrête quand
I Wk+1 = Wk et Wk ≤ Di ⇒ ordonnaçable
I ou Wk > Di ⇒ non ordonnançable

32 / 33

Vous aimerez peut-être aussi