Systèmes temps-réel et systèmes embarqués
Révision datée du 30 novembre 2015 à 00:41 par Loic (discussion | contributions) (→Polycopiés 2012/2013)
Contenu de la formation : 8 séances de cours de 1h15 + 3 séances de 4 heures de TP
Intervenants : Loïc Cuvillon et Jacques Gangloff
Cours
Polycopiés 2012/2013
- Eléments d'architecture des ordinateurs : TR_Architecture_2015.pdf
- Architecture des systèmes d'exploitation : polycopié, version slides
- Linux et le temps réel : Linux_TR_2015.pdf
- Systèmes embarqués : polycopié, version slides
Exemples
Architecture des systèmes d'exploitation
Commande pour compiler les exemples : gcc test.c -lpthread -o test
L'archive regroupant tous les tests (mise à jour novembre 2015) est disponible ici.
./test I'm the parent. i=10 I'm the child. i=20
On note la séparation des espaces mémoire des 2 processus contrairement aux threads.
./test Dad : damned who stole my beer ! Dad : damned who stole my beer ! Son : damned who stole my coke ! Dad : damned who stole my beer ! [CTRL-C]
Si entre l'affectation (refrigerator = COKE; par exemple) et le test (if ( refrigerator == COKE ) { par exemple), l'autre thread change le contenu du réfrigérateur, il y a conflit. On est dans le cas typique de l'accès concurrent à une ressource commune : le frigidaire.
./test [CTRL-C]
Le mécanisme d'exclusion mutuelle de Peterson est utilisé pour réaliser une section critique comprise entre l'affectation et le test.
./test syscall(SYS_getpid)=2058 getpid()=2058 La commande getpid est équivalente à l'appel système SYS_getpid.
./test Period = 10163 us Period = 10269 us Period = 21635 us Period = 8276 us Period = 23642 us Period = 6262 us Period = 21404 us ... Period = 20196 us Period = 19801 us Period = 20653 us Period = 9343 us Period = 10708 us Period = 9290 us Period = 10008 us Period = 9991 us Period = 11970 us Period = 8053 us Period = 9978 us Max latency : 19843 Max advance : 9726
Cet exemple démontre l'imprécision d'une tâche périodique sur un système temps-réel mou (linux).
./test Thread_HP : running at FIFO/2 Thread_HP : non critical. Thread_LP : running at FIFO/1 Thread_LP : non critical. Thread_LP : critical. Thread_HP : mutex timeout.
La thread HP (Haute Priorité) bloque indéfiniment sur un mutex car une thread de basse priorité est dans la section critique et consomme du temps CPU.
Thread 0xb464eba0 : i = 0 write current_time = 1199815415 Thread 0xb6652ba0 : i = 0 read current_time = 1199815415 Thread 0xb6652ba0 : i = 1 read current_time = 1199815415 Thread 0xb6e53ba0 : i = 0 read current_time = 1199815415 Thread 0xb6e53ba0 : i = 1 read current_time = 1199815415 Thread 0xb6652ba0 : i = 2 read current_time = 1199815415 Thread 0xb6e53ba0 : i = 2 read current_time = 1199815415 Thread 0xb7e55ba0 : i = 0 read current_time = 1199815415 Thread 0xb5e51ba0 : i = 0 write current_time = 1199815415 Thread 0xb5650ba0 : i = 0 write current_time = 1199815416 Thread 0xb4e4fba0 : i = 0 write current_time = 1199815416 Thread 0xb7654ba0 : i = 0 read current_time = 1199815416 Thread 0xb6652ba0 : i = 3 read current_time = 1199815416 Thread 0xb6652ba0 : i = 4 read current_time = 1199815416 Thread 0xb7654ba0 : i = 1 read current_time = 1199815416 Thread 0xb7654ba0 : i = 2 read current_time = 1199815416 Thread 0xb6e53ba0 : i = 3 read current_time = 1199815416 Thread 0xb6e53ba0 : i = 4 read current_time = 1199815416 Thread 0xb6652ba0 : i = 5 read current_time = 1199815416 Thread 0xb6652ba0 : i = 6 read current_time = 1199815416 Thread 0xb7654ba0 : i = 3 read current_time = 1199815416 Thread 0xb7654ba0 : i = 4 read current_time = 1199815416 Thread 0xb6e53ba0 : i = 5 read current_time = 1199815416 Thread 0xb7654ba0 : i = 5 read current_time = 1199815416 Thread 0xb6652ba0 : i = 7 read current_time = 1199815416 Thread 0xb5e51ba0 : i = 1 write current_time = 1199815416 Thread 0xb5650ba0 : i = 1 write current_time = 1199815416
Problème du "reader-writer" simulant l'accès en lecture et écriture à une base de données. L'accès en lecture peut se faire avec plusieurs thread simultanément mais l'accès en écriture doit être unique. Le mécanisme implémenté évite à la thread qui écrit d'attendre indéfiniment que les thread qui lisent aient terminé.
Avec des priorités identiques : ./test Thread_HP : running at RR/1 Thread_LP : running at RR/1 HP: hp_count: 100000000 lp_count: 94578307 ratio : 1.057325e+00 LP: hp_count: 100000000 lp_count: 100000000 ratio : 1.000000e+00
Avec des priorités différentes : ./test Thread_HP : running at RR/2 Thread_LP : running at RR/1 HP: hp_count: 100000000 lp_count: 0 ratio : inf
Cet exemple montre les effets des politiques de séquencement dans le cas de 2 threads dont les priorités sont variables et avec des stratégies de séquencement variables : SCHED_RR (round-robin) ou SCHED_FIFO (FIFO).