Changes between Version 26 and Version 27 of AS6-TME-B5


Ignore:
Timestamp:
Feb 21, 2022, 1:43:18 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B5

    v26 v27  
    248248{{{#!protected ------------------------------------------------------------------
    249249'''
    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
     255int 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}
     260void 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}}}
     2691. 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()`
    257277'''
    258278}}}