Changes between Version 28 and Version 29 of AS6-TME-B5
- Timestamp:
- Feb 21, 2022, 2:15:51 PM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
AS6-TME-B5
v28 v29 113 113 ''' 114 114 * Ça dépend un peu de la fréquence du processeur. Il faut que la commutation soit assez rapide pour donner l'illusion du parallélisme (l'impression que tous les threads s'exécutent en même temps), mais pas trop à cause de l'overhead de changement de thread. La réponse est entre 10 et 100Hz. Plus la fréquence du processeur est élevée, plus la fréquence de commutation peut être rapide. À 1GHz, un processeur exécute 10 millions de cycles en 10ms (100Hz), si l'overhead de changement de thread est de 1000 cycles (un ordre de grandeur), l'overhead prend 0.01% du temps d'exécution du processeur, c'est négligeable. 115 ''' 116 }}} 117 1. Comment nomme-t-on la durée entre deux interruptions d'horloge ? Ici, c'est le temps d'une instance d'exécution d'un thread. 118 ''' 119 * C'est le **tick**. Un tick d'horloge est la durée entre deux IRQ du timer. 120 * Dans l'état actuel du code, on fait une commutation de thread à chaque tick. Dans un système plus évolué, on a la notion de **quantum** qui correspond pas un nombre fini de tick, par exemple 1 quantum = 10 ticks. Ce quantum peut varier au cours du temps pour donner plus de temps à certains threads (au démarrage par exemple ou pour des tâches que l'on veut favoriser) 115 121 ''' 116 122 }}} … … 274 280 * `thread_bootstrap()`\\se contente de changer l'état du thread élu à `RUNNING` (`sched_switch()` donnera aussi cet état quand le thread sera réélu, mais pour le moment c'est la première fois que le thread est choisi alors on n'est pas revu dans `sched_switch()`),\\puis `thread_bootstrap()` appelle `thread_launch()` en lui donnant 3 arguments : la fonction principale du thread, son argument et la fonction de démarrage du thread. Dans le cas du thread `main()`, les deux premiers arguments sont NULL parce la fonction de démarrage du thread main `_start()` sait ce qu'il faut faire (lancer `main()`) 275 281 * `thread_launch()`\\c'est juste l'appel à `eret` après avoir initialisé `c0_EPC` avec l'adresse de la fonction de démarrage du thread. 276 * `thread_start()` ou `_start()`\\on est dans le code de l'application , on appelle282 * `thread_start()` ou `_start()`\\on est dans le code de l'application et on appelle la fonction principale du thread. 277 283 ''' 278 284 }}} … … 280 286 {{{#!protected ------------------------------------------------------------------ 281 287 ''' 282 * 288 * Soit c'est lui qui demande par l'appel explicite à `thread_yield()`, soit c'est une interruption d'horloge 283 289 ''' 284 290 }}}