Changes between Version 24 and Version 25 of AS6-TME-B5


Ignore:
Timestamp:
Feb 21, 2022, 12:54:19 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B5

    v24 v25  
    1515La majorité des réponses aux questions sont dans le cours ou dans le rappel du cours donné au début de cette page, c'est voulu. Les questions suivent à peu près l'ordre du cours, elles sont simples, mais vous avez besoin de comprendre le cours pour y répondre :-)
    1616Quand une question vous demande si quelque chose est vrai ou faux, ne répondez pas juste "oui" ou "non », mais justifiez vos réponses avec une petite phrase. Le but de ces questions est d'évaluer vos connaissances, donc plus vous êtes précis, mieux c'est. Vous avez un corrigé que vous devez consulter pour vous autocorriger, mais pour qu'il soit utile, lisez-le après avoir cherché vous-même les réponses.
    17 
     17Dans certains cas, ce ne sera pas simple, mais tentez quand même une réponse, même si vous savez que c'est faux car ce sera plus simple de comprendre la réponse.
    1818
    1919== A.1. Questions générales
     
    175175      * En conséquence, on sortira de `thread_load()` par `thread_save()` et on revient dans `sched_switch()`.
    176176      * Pour qu'on ne rentre pas dans une boucle sans fin, la valeur de retour de `thread_save()` après une restauration de contexte est `0` (alors que c'est `1` après une sauvegarde). On teste donc cette valeur de retour de `thread_save()` pour savoir ce qu'on doit faire ensuite.
    177       * On sort ensuite de `sched_switch()` et on revient dans `thread_yield()` (actuellement c'est le seul cas, mais nous verrons d'autres fonctions appelant `sched_switch()`.
     177      * On sort ensuite de `sched_switch()` et on revient dans `thread_yield()` (actuellement c'est le seul cas, mais nous verrons d'autres fonctions appelant `sched_switch())`.
    178178      * Après, on revient dans un syscall ou dans l'ISR du timer, suivant l'événement qui avait abouti à la perte du processeur par le thread courrant.
    179179   
     
    185185
    186186
    187 1. Quelles sont les fonctions de l'API utilisateur des threads et les états de threads ? Indiquer les changements d'état provoqué par l'appel des fonctions de cette API.
    188 {{{#!protected ------------------------------------------------------------------
    189 '''
    190  *
     1871. Quelles sont les fonctions de l'API utilisateur des threads et les états de threads ? Indiquer les changements d'état provoqué par l'appel des fonctions de cette API. Regardez les transparents pour répondre.
     188{{{#!protected ------------------------------------------------------------------
     189'''
     190 * Il y a 3 fonctions dans l'état actuel du code, il y en aura d'autres plus tard dans le module.
     191   * Création : `int thread_create ( thread_t * thread,  void *(*fct) (void *), void *arg);`\\
     192     Le thread créé prend l'état `READY`
     193   * Cession :  `int thread_yield (void);`\\
     194     Le thread créé passe de l'état `RUNNING` (donné par l'ordonnanceur) à l'état `READY`
     195   * Terminaison : `int thread_exit (void *retval);`\\
     196     Le thread créé passe de l'état `RUNNING` (donné par l'ordonnanceur) à l'état `DEAD`\\
     197 * Nous verrons d'autres fonctions (p.ex. `mutex_lock()`) et d'autres états de threads (p.ex. `WAIT` ou `ZOMBI`)
    191198'''
    192199}}}
     
    194201{{{#!protected ------------------------------------------------------------------
    195202'''
    196  *
     203 * Pour chaque thread, on a besoin d'une pile d'exécution, d'un tableau pour stocker le contexte (les valeurs de registres) et des propriétés (état, pointeur sur la fonction principale, etc.
     204 * La pile est nécessairement dans l'espace utilisateur parce que les fonctions utilisateurs vont y mettre leur contexte d'exécution.
     205 * Le contexte du thread et ses propriétés pourraient être mis dans l'espace noyau, mais il faudrait avoir 2 structures par thread.
     206   * une dans l'espace utilisateur pour la pile et peut-être d'autres informations (que nous verrons plus tard)
     207   * une dans l'espace noyau, pour le contexte du thread et ses propriétés.
     208 * Lors de la création d'un thread, il faudrait allouer deux structures dynamiquement, mais c'est impossible dans l'état actuel du code car nous n'avons pas d'allocateur de mémoire dynamique.
     209 * Nous avons donc fait un choix simplificateur et une seule structure entièrement dans l'espace utilisateur. C'est un choix temporaire.
    197210'''
    198211}}}
     
    200213{{{#!protected ------------------------------------------------------------------
    201214'''
    202  *
    203 '''
     215 * Lorsque l'ordonnance élit un thread pour la première fois,
     216   * il va débuter par `thread_bootstrap()` parce que c'est l'adresse de cette fonction qui a été mis dans **`$31`**,
     217   * aucun registre GPR ne contient encore rien de significatif, sauf bien sûr **`$sp`** le pointeur de pile,
     218   * `thread_bootstrap()` appelle `thread_launch()` pour sauter dans la fonction `thread_start()` avec l'instruction `eret`, il faut que `$c0_sr` soit tel que l'exécution d'`eret` nous amène en mode user, interruptions autorisées.
     219''
    204220}}}
    2052211. `$c0_sr` est initialisé avec `0x413`, dite pourquoi.