Cours d’introduction a la programmation systeme
-
Cours d’introduction à la programmation
Chapitre 1 Introduction à la programmation temps réel
1.1 Qu’est-ce que la programmation temps réel ?
U N SYSTÈME temps réel est un système informatique devant répondre à des stimuli de l’environnement en tenant compte de contraintes de temps. Le comportement correct d’un tel système ne dépend donc pas uniquement des résultats fournis, mais également de la date à laquelle ces résultats sont communiqués. Un calcul correct mais tardif sera considéré comme faux, si les contraintes temporelles du système sont strictes. Par opposition aux systèmes temps réel, un système informatique standard est dit transformationnel. Une application de bureautique standard tournant sur un PC est un système transformationnel. Les données y sont traitées, sans que le temps nécessaire à ce traitement ne soit crucial. Un système temps réel typique sera décomposé en tâches, chaque tâche étant responsable de la gestion d’une partie du système. La figure 1.1 illustre l’interaction qu’a un tel système avec son environnement, dans le cas d’une tâche de contrôle. Nous pouvons noter que certains systèmes n’auront pas à proprement parler de système de gestion des sorties vers s l’environnement. Les sorties pourront effectivement être un fichier restant interne au système informatique.
La définition donnée par Abrial-Bourgne définit bien ce qu’est un système temps réel : Un système fonctionne en temps réel s’il est capable d’absorber toutes les informations d’entrée sans qu’elles soient trop vieilles pour l’intérêt qu’elles représentent, et par ailleurs, de réagir à celles-ci suffisamment vite pour que cette réaction ait un sens. [6]
Et l’adage suivant devra être gardé en mémoire : Un résultat juste mais hors délai est un résultat faux.
Le fait qu’un résultat soit faux de par son arrivée tardive peut être extrêmement critique et même dangereux. Un exemple typique est un pilote automatique dans un avion. Un tel système pourrait être décomposé en une tâche responsable de récupérer les valeurs de différents capteurs (altitude, vitesse, ...), une tâche responsable de calculer la puissance à fournir aux réacteurs ainsi que les angles des empennages, et une dernière tâche responsable des actuateurs (arrivée de carburant, empennages). Si une mesure des capteurs est effectuée régulièrement, que les données sont transmises à la tâche de calcul, qui ensuite transmet ses résultats à la dernière tâche, il serait judicieux que ce processus ne prenne pas un temps trop important. En effet, à 300km/h lors d’un atterissage, une second d’inattention pourrait être fatale. Dans ce cas, les tâches doivent avoir des délais stricts, et ces délais doivent absolument être respectés pour que le fonctionnement global soit considéré comme correct, un fonctionnement anormal pouvant avoir des conséquences désastreuses. Cet exemple peut montrer qu’il faut que le système effectue son traitement le plus rapidement possible. Mais attention à ne pas tomber dans le piège : Un système temps réel n’est pas un système qui effectue du calcul de manière rapide. En effet, les systèmes que nous traiterons doivent fournir les résultats dans un temps bien spécifique, mais celui-ci peut être long. La rapidité n’est pas un critère, par contre la fiabilité, liée au respect de contraintes temporelles, en est un. Les délais de systèmes temps réel peuvent effectivement être très lâches, mais extrêmement sensibles à des dépassements de délai. Le tableau 1.1 montre des exemples d’ordres de grandeur de temps, dans les systèmes informatiques. Durant ce cours de programmation temps réel, nous allons étudier des algorithmes permettant d’assurer la bonne marche d’un système temps réel, et notamment voir pourquoi aller vite ne suffit pas. Nous verrons également qu’il est très délicat d’être sûr qu’un système a été correctement conçu, et qu’il est possible qu’un tel système fonctionne pendant longtemps avant qu’une faute ne puisse survenir. Afin de garder à l’esprit ce type de mauvaise surprise, le tableau 1.2 liste quelques lois tirées de [4] particulièrement adaptées au contexte du temps réel. N’oubliez pas de vous y référer lorsqu’un système qui a fonctionné pendant plusieurs minutes, heures, ou jours, vient subitement de décider de crasher.
1.2 Propriétés attendues
Les systèmes temps réel sont des systèmes devant respecter les contraintes de temps imposées. A priori, le code de chacune des tâches composant un tel système est connu. Il peut donc être analysé en termes de temps d’exécution, ressources nécessaires, et dépendance envers d’autres tâches. Les propriétés suivantes devraient être respectées : Gestion du temps. Les résultats doivent être corrects, non seulement en termes de valeur, mais également termes de temps d’arrivée. Le système doit garantir que les tâches se terminent dans les délais impartis, en respectant les contraintes de temps imposées. Conception pour stress. Un système temps réel ne doit pas succomber lorsqu’il est soumis à une charge importante. Des scénarios mettant en avant des charges limites doivent être anticipés, et testés. Predictibilité. A chaque décision liée à l’ordonnançement des tâches, le système doit être capable de prédire les conséquences de son choix. Il doit pouvoir dire si les tâches sont ordonnançables, et si tel est le cas proposer un ordonnançement. S’il n’est pas possible de gérer l’ensemble de tâches, des actions coordonnées doivent être prises afin de ne pas compromettre le fonctionnement du système.
…
Tolérance aux fautes. Un système de contrôle critique (p. ex. dans un avion) doit être tolérant aux fautes logicielles et matérielles. Les composants utilisés doivent donc être conçu pour être tolé- rants aux fautes. Maintenance. Comme tout système informatique, l’architecture d’un système temps réel doit être pensé de façon modulaire, afin que des modications du système puissent être réalisées facilement.
1.2.1 Prédictibilité Alors qu’un système informatique standard ne fait que traiter des données, le système temps réel doit garantir que les contraintes de temps seront respectées. Lors de l’attribution du processeur à telle ou telle tâche, le système doit obligatoirement connaître le temps d’exécution de chacune des tâches. Ceci nécessite de connaître plusieurs éléments :
• Le code écrit par le programmeur
• La structure du noyau du système d’exploitation
• La structure du processeur et de ses périphériques
…
Programmation Le code d’une tâche devant être exécutée dans un contexte temps réel doit être particulièrement bien conçu. Nous notons ici trois lois qu’un développeur devrait respecter : Absence de structures de données dynamiques. Les langages de haut niveau permettent d’allouer et de désallouer dynamiquement de la mémoire lors de l’exécution. Toutefois ces opérations sont très lourdes en termes de temps processeur, et ne peuvent aisément être bornées en temps. Dès lors il est très délicat d’évaluer le pire temps d’exécution d’une tâche exécutant une allocation mémoire. Si des allocations dynamiques sont nécessaires, elles devraient être faites au lancement du système, mais pas durant son exécution courante. Absence de récursion. Les appels récursifs devraient être évités, car, si la profondeur de récursion n’est pas connu a priori, le temps ainsi que les ressources nécessaires ne pourront être bornés. Boucles bornées en temps. Le nombre d’itérations des boucles devrait être borné, afin de pouvoir estimer leut temps d’exécution. Si tel n’est pas le cas, il est impossible d’estimer le temps d’exé- cution d’une tâche.
- Evaluation :
-
Soyez le premier à écrire un commentaire sur ce fichier!
Veuillez vous identifier ou vous enregistrer.