Changes between Version 14 and Version 15 of AS6-TME-B6


Ignore:
Timestamp:
Mar 26, 2022, 2:41:34 PM (2 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B6

    v14 v15  
    99
    1010- kO6 propose l'API `list` permettant de gérer les listes chaînées
    11   - Cet API est définie dans le fichier `common/list.h` utilisable par le noyau et par l'application.
    12   - L'API `list` chaîne des éléments de liste de type `list_t`, structure composée d'un double pointeurs pointant vers d'autres structures `list_t`.
    13   - Les éléments de liste sont embarqués dans des structures porteuses. Ce sont les éléments de liste qui sont chaînés, mais l'API `list` permet de retrouver le pointeur sur la structure porteuse.
    14   - L'API `list` permet l'ajout et l'extraction d'élément de liste au début, au milieu ou à la fin d'une liste. Elle permet aussi l'ajout d'élément en utilisant une relation d'ordre pour obtenir des listes triées.
    15   - L'API `list` permet le parcours de tous les éléments d'une liste.
     11  - Cette API est définie dans le fichier `common/list.h` utilisable par le noyau et par l'application.
     12  - L'API `list` chaîne des éléments de liste de type `list_t`, structure composée d'un double pointeur pointant vers d'autres structures `list_t`.
     13  - Les éléments de liste sont embarqués dans des structures porteuses. Ce sont les éléments de liste qui sont chaînés, mais l'API `list` permets de retrouver le pointeur sur la structure porteuse.
     14  - L'API `list` permets l'ajout et l'extraction d'éléments de liste au début, au milieu ou à la fin d'une liste. Elle permet aussi l'ajout d'élément en utilisant une relation d'ordre pour obtenir des listes triées.
     15  - L'API `list` permets le parcours de tous les éléments d'une liste.
    1616
    1717- Le code user de l'application (on dira juste application dans la suite) et le noyau ont besoin d'allouer dynamiquement de la mémoire.
    18   - L'application et le noyau disposent chacun d'un segment d'adresse propre, nommés respectivement `.data` et `.kdata`, pour leurs données. Ces segments ont été partiellement remplis par des variables globales du programme au moment de son chargement en mémoire.
     18  - L'application et le noyau disposent chacun d'un segment d'adresse propre, nommé respectivement `.data` et `.kdata`, pour leurs données. Ces segments ont été partiellement remplis par des variables globales du programme au moment de son chargement en mémoire.
    1919  - Les allocateurs dynamiques utilisent l'espace libre de ces segments `data`.
    2020  - L'application a 2 besoins distincts d'allocation dynamiques :
     
    2323  - Les différences entre ces deux types de types d'allocation sont les suivantes :
    2424    - D'un côté, les variables dynamiques sont allouées par l'application en fonction de ses besoins. La taille des variables est quelconque, allant de quelques octets à plusieurs mégaoctets (tant que c'est possible dans la mémoire disponible).
    25     - D'un autre côté, les piles des threads sont certes dans l'espace utilisateur, mais elles sont allouées par le noyau au moment de la création des threads. Leur taille est standard et fixe (dans un vrai système, on peut les choisir leur taille, mais pas pour kO6).
     25    - D'un autre côté, les piles des threads sont certes dans l'espace utilisateur, mais elles sont allouées par le noyau au moment de la création des threads. Leur taille est standard et fixe (dans un vrai système, on peut choisir leur taille, mais pas pour kO6).
    2626
    2727- Nous avons donc 3 allocateurs dans kO6 :
     
    3939
    4040- L'allocateur de variables dynamiques pour l'application
    41   - Cet allocateur dispose d'un segment d'adresse nommé `heap` placé en bas de la section `.data`, juste après les variables globales, aligné sur les lignes de caches.
     41  - Cet allocateur dispose d'un segment d'adresse nommé `heap` placé en bas de la section `.data`, juste après les variables globales, alignées sur les lignes de caches.
    4242  - l'adresse limite du `heap` est nommée `heap_end`
    4343  - L'allocateur gère des blocs (il fallait bien donner un nom...)
     
    5151    - Si la place restante est plus petite qu'une ligne de cache, alors l'ensemble du bloc est marqué comme `plein`.
    5252    - Sinon, le bloc est scindé en deux blocs, le premier `plein` et le second `vide`.
    53     - Si l'allocateur ne trouve pas de bloc assez grand, alors il parcours l'ensemble des blocs et si deux blocs voisins sont libres, il les réunit, puis il retente l'allocation. S'il échoue encore, il sort avec NULL.
     53    - Si l'allocateur ne trouve pas de bloc assez grand, alors il parcourt l'ensemble des blocs et si deux blocs voisins sont libres, il les réunit, puis il retente l'allocation. S'il échoue encore, il sort avec NULL.
    5454    - Quand l'allocateur a trouvé un bloc, il rend un pointeur dessus.
    5555  - `void free(void *)`
    5656    - La fonction vérifie que l'adresse en argument a bien été allouée par `malloc()`.
    57     - Elle marque le bloc pointée comme `vide`.
     57    - Elle marque le bloc pointé comme `vide`.
    5858
    5959- L'allocateur de variables dynamiques pour le noyau
    6060  - Le noyau alloue des structures ou des tables pour rendre ses services, pour les threads, les devices drivers, les ressources de synchronisation, le système de fichiers, etc.
    61   - Nous appelons ces structures et ces tables des objets (pour leur donner un nom différent de block), les objets ont un nombre entier de lignes de cache.
     61  - Nous appelons ces structures et ces tables des objets (pour leur donner un nom différent de bloc), les objets ont un nombre entier de lignes de cache.
    6262  - Le noyau doit pouvoir allouer et libérer ses objets très rapidement.
    6363  - L'allocateur d'objets gère des listes d'objets libres de même taille.
    6464  - Pour allouer un objet, l'allocateur se contente de prendre le premier objet libre dans la liste des objets libres de la bonne taille.
    6565  - Pour libérer un objet, l'allocateur se contente de remettre l'objet au début de la liste des objets libres de la bonne taille.
    66   - Au départ, toutes les listes sont vides.
    67 
    68  
    69 
    70 
    71 
    72 (pas fini)
     66  - Au départ, toutes les listes sont vides. Lorsqu'une demande d'allocation est faite pour une certaine taille, l'allocateur va allouer une dalle (slab en anglais) de 4kO, il découpe la dalle avec autant d'objets de la taille demandée que possible et il chaine ces objets pour former une liste d'objets libres. Il alloue alors le premier objet.
     67  - Lors de la libération d'un objet, il peut s'avérer que tous les objets d'une dalle X sont libres. Dans ce cas, l'allocateur retire de la liste d'objets libres tous les objets appartenant à la dalle X et il rend cette dalle à la liste des dalles libres.
     68
    7369
    7470