Changes between Version 15 and Version 16 of AS6-TME-B5


Ignore:
Timestamp:
Feb 20, 2022, 6:28:46 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B5

    v15 v16  
    4545'''
    4646}}}
    47 1. Dans un fichier exécutable (le programme) avant qu'il ne soit chargé en mémoire, on trouve le code du programme et les données globales. Est-ce qu'il y a aussi les piles d'exécution des threads ? justifiez votre réponse.
    48 {{{#!protected ------------------------------------------------------------------
    49 '''
    50  * Non, en principe non, puisque les piles sont créées à la volée à chaque création des threads. Mais, dans la version actuelle du système, qui n'a pas encore de service de mémoire dynamique, les piles des threads sont dans des variables globales de type `thread_s`, alors on peut se demander si elles sont dans le fichier. La réponse est non, parce que les variables globales thread de type `struct thread_s` ne sont pas initialisées. Elles sont donc dans une section `BSS` qui n'est pas vraiment dans le fichier objet.
     471. Dans un fichier exécutable, avant qu'il ne soit chargé en mémoire, on trouve le code du programme et les données globales. Est-ce qu'il y a aussi les piles d'exécution des threads ? justifiez votre réponse.
     48{{{#!protected ------------------------------------------------------------------
     49'''
     50 * Non, en principe non, puisque les piles sont créées à la volée à chaque création des threads. Mais, dans la version actuelle du système, qui n'a pas encore de service de mémoire dynamique, les piles des threads sont dans des variables globales de type `struct thread_s`, alors on peut se demander si elles sont dans le fichier. La réponse est non, parce que les variables globales thread de type `struct thread_s` ne sont pas initialisées. Elles sont donc dans une section `BSS` qui n'est pas vraiment dans le fichier objet.
    5151'''
    5252}}}
     
    5454{{{#!protected ------------------------------------------------------------------
    5555'''
    56  *
     56 * On en a au moins 1 dont la fonction principale est `main()`. Le nombre maximum est défini dans le système d'exploitation pour notre cas, mais plus généralement, il est dépend de la quantité de mémoire disponible car chaque thread utilise une pile qui peut être grande.
    5757'''
    5858}}}
     
    6060{{{#!protected ------------------------------------------------------------------
    6161'''
    62  *
     62 * Non, chaque thread a sa propre pile. On peut se dire qu'ils partagent leur pile, si on imagine créer une variable `VA` locale dans la pile d'un thread `TA`et que l'on passe l'adresse de cette variable locale `VA` à un autre thread `TB`. C'est possible, mais ce n'est pas recommandé, car certains OS interdisent cette pratique. Pour faire communiquer deux threads, il faut passer par des variables globales. Nous verrons cela plus tard dans les prochaines semaines.
    6363'''
    6464}}}
     
    6767{{{#!protected ------------------------------------------------------------------
    6868'''
    69  *
     69 * Bien sûr, rien ne l'en empêche, c'est généralement le cas. Si vous appeler par exemple `printf()` dans votre thread, c'est un appel de fonction.
    7070'''
    7171}}}
     
    7373{{{#!protected ------------------------------------------------------------------
    7474'''
    75  *
    76 '''
    77 }}}
    78   a. Combien d'arguments la fonction  principale peut-elle prendre et de quel type ?
    79 {{{#!protected ------------------------------------------------------------------
    80 '''
    81  *
     75 * Bien sûr, plusieurs threads peuvent se partager le même code. Ils n'auront pas la même pile et donc il n'auront pas la même histoire.
     76'''
     77}}}
     78  a. Combien d'arguments la fonction  principale d'un thread peut-elle prendre et de quel type ?
     79{{{#!protected ------------------------------------------------------------------
     80'''
     81 * Le prototype de la fonction principale d'un thread est imposé par la fonction `thread_create()`. Une fonction principale de thread prend un seul argument de type `void *` et elle rend un `void *`. Si on veut passer plusieurs arguments, il faut les mettre dans une structure et passer le pointeur sur cette structure.
     82 * Il y a quand même une exception pour le thread `main()` créé systématiquement au démarrage du processus. Comme vous le savez, la fonction `main()` prend jusqu'à 3 arguments : `int argc`, `char *argv[]` et un moins connu `char *arge[]`. Dans notre système `main()` n'a pas d'arguments, alors que normalement c'est grâce au shell que l'utilisateur peut définir les arguments `argc`, `argv` et `arge`, mais nous n'avons pas encore de shell. La fonction `main()` rend un `int` et non pas un `void *`.
    8283'''
    8384}}}
     
    8586{{{#!protected ------------------------------------------------------------------
    8687'''
    87  *
     88 * Ça dépend de quel thread on parle.
    8889'''
    8990}}}