| 250 | | * |
| 251 | | ''' |
| 252 | | }}} |
| 253 | | 1. Quand un thread est élu pour la première fois, à la sortie de `thread_load()`, on appelle la fonction `thread_bootstrat()`. Retrouvez dans les transparents du cours les étapes qui vont mener à l'exécution de la fonction principale du thread élu, et expliquez-les. |
| 254 | | {{{#!protected ------------------------------------------------------------------ |
| 255 | | ''' |
| 256 | | * |
| | 250 | * Si vous avez trouvé, vraiment bravo ! |
| | 251 | * Un principe de fonctionnement de l'ordonnanceur, c'est que l'ordonnanceur ignore la raison pour laquelle un thread perd le processeur. |
| | 252 | * Son travail, c'est d'élire un nouveau thread entrant, sauver le contexte du thread sortant et charger le contexte du thread entrant. Il change également l'état du thread entrant à `RUNNING` parce qu'il sait que c'est le bon état (il vient de charger un contexte et donc le thread entrant est nécessairement le ''`RUNNING` thread''). |
| | 253 | * Actuellement, un thread a deux manières de perdre le processeur : `thread_yield()` et `thread_exit()`: |
| | 254 | {{{#!c |
| | 255 | int thread_yield (void) { |
| | 256 | thread_tab[thread_current_idx]->state = TH_STATE_READY; // l'état passe de RUNNING à READY (le thread cède juste le proc) |
| | 257 | sched_switch (); // demande à l'ordonnanceur de trouver un autre thread READY |
| | 258 | return 0; |
| | 259 | } |
| | 260 | void thread_exit (void *value_ptr) { |
| | 261 | thread_tab[thread_current_idx]->state = TH_STATE_DEAD; // l'état passe à DEAD |
| | 262 | sched_switch (); // demande à l'ordonnanceur de trouver un autre thread READY |
| | 263 | } |
| | 264 | }}} |
| | 265 | * Comme vous pouvez le voir, dans ces fonctions, on commence par changer l'état du thread et après on appelle `sched_switch()`. |
| | 266 | * Pour le moment c'est un simple changement d'état avant l'appel à `sched_switch()`, mais plus tard, il y aura d'autres opérations, pour la gestion des listes d'attente des ressources partagées ou la gestion des terminaisons de threads dont d'autres attendent la terminaison (avec `thread_join`). |
| | 267 | ''' |
| | 268 | }}} |
| | 269 | 1. Quand un thread est élu pour la première fois, à la sortie de `thread_load()`, on appelle la fonction `thread_bootstrap()`. Retrouvez dans les transparents du cours les étapes qui vont mener à l'exécution de la fonction principale du thread élu, et expliquez-les. |
| | 270 | {{{#!protected ------------------------------------------------------------------ |
| | 271 | ''' |
| | 272 | * J'ai déjà décrit les étapes dans d'autres réponses, mais je vais le refaire. |
| | 273 | * `thread_bootstrap()` appelle `thread_launch()` qui appelle `thread_start()` ou `_start` qui appelle la fonction principale de thread. |
| | 274 | * `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()`. |
| | 275 | * `thread_launch()` |
| | 276 | * `thread_start()` |