dimanche 15 novembre 2009

Linux et les systèmes RTOS (Real Time Operating System)

Petit résumé d'une récente lecture relative aux systèmes d'exploitation de type "temps réel" (RTOS).
 

contraintes des systèmes RTOS
L'article "Anatomy of real-time Linux architectures" (pdf) paru sur IBM propose une excellente introduction aux systèmes temps réels qui présente les différentes exigences/contraintes de ces systèmes.
C'est ainsi que sont abordés les temps de latences, le traitement en tâches périodiques, les deadlines.
Les systèmes RTOS ont la capacité de pouvoir assumer des tâches "temps réel" (immédiatement) même lorsque l'OS est déjà fortement chargé.
Dans les systèmes RTOS, l'interruption des tâches (et processus) est un des principes fondateur. Il permet de libérer du temps machine pour un tâche de type "temps réel".
Par exemple, un fois les différents senseurs activés, l'analyse du déclenchement d'un AirBag doit être traité endéans les quelques micro-secondes. Un Airbag se déclenchant trop tard étant plus dangereux qu'un véhicule sans d'AirBag! C'est là que réside l'une des principales contrainte du traitement "temps réel".
A contrario, les systèmes Linux normaux ne peuvent pas interrompre certaines tâches en cours. Par exemple, un appel au Kernel effectué par un processus n'est pas interromput (et pas intérrompable). Ces appels au Kernel sont exécutés jusqu'a leurs termes.
L'arrivé d'un intérruption ne suspendra pas l'exécution de cette tâche Kernel en cours. Le traitement de l'intérruption sera quelque peu postposé mais sera néanmoins effectuée en des temps raisonnables (~20 ms, mais sans garantie quand au temps de latence).
Pour l'utilisateur du PC, ces 20 ms sont à peine perceptibles.

Pour un système RTOS, ce délai d'exécution de 20 ms peut être beaucoup trop long... à titre d'exemple, un système ABS contrôle, échantillone et modifie la pression hydrolique des quatres freins environ 20 fois par seconde. Ces exigences sont incompatibles avec un système Linux standard qui prendrait 20 ms de temps de réponse.
On le comprendra aisément, le contrôle du temps, et par conséquent le caractère deterministe, est primordial dans les systèmes temps réel.

Hard et Soft real-time
Pour en revenir à cette excellente publication, l'auteur nous introduit également aux notions des systèmes soft real-time et hard real-time. L'on apprendra ainsi que les systèmes soft real-time ne sont pas tenu à des deadlines précises. Une réponse dans un temps moyen donné étant acceptable, la stabilité du système n'étant pas mise en cause en cas de dépassement de la deadline.
Par contre les systèmes hard real-time sont ceux pour lesquels il est primordial d'obtenir la fin du traitement au plus tard à la deadline. Rater une deadline dans un système hard real-time conduira inévitablement ce dernier dans une situation d'échec (instabilité, erreur système).
Déjà évoqué précédemment, le contrôle d'un Airbag est de type hard real-time (déclenché trop tard, l'airbag pourrait même tuer le conducteur).

Implémenter un système temps réel avec Linux
Parmi les approches permettant d'implémenter un système temps réel, l'on retrouve thin-kenel, nano-kernel et resource-kernel (plus d'information dans l'article d'IBM avec référence des OS).
Depuis la version 2.6 du Kernel, Linux inclus une pile d'exécution Real-time Tasks au niveau du kernel lui-même. Il est ainsi possible de développer des tâches du type soft real-time. Ainsi, avec la nouvelle option CONFIG_PREEMPT, le kernel Linux devient également "preemptable". Au prix d'une légère perte de performance, le kernel peut interrompte l'exécution de processus utilisateur (mais également d'appels d'API kernel) pour réallouer les ressources aux tâches temps réel exécutées par la pile Real-time Tasks du kernel.
Les systèmes temps réels étant intimement liés au temps, le Kernel 2.6 implémente également un nouveau scheduler à haute résolution (si le matériel le supporte). Ainsi, selon la configuration matérielle, il est possible d'avoir des timers d'une préçsion allant jusqu'à la micro-seconde.

Le hard real-time avec Linux
Au prix de quelques efforts, il est également possible d'obtenir un Kernel Linux supportant le hard real-time en appliquant le patch PREEMPT_RT sur le kernel Linux.
Ce patch re-implémente certains primitives de locking, l'héritage de priorité dans les mutexes et un gestionnaire d'intéruption alternatif (dans un thread) du kernel afin de pouvoir suspendre leurs exécutions.

Autres ressources:

Aucun commentaire: