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()` |