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


Ignore:
Timestamp:
Mar 26, 2022, 2:11:37 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B6

    v13 v14  
    1414  - 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.
    1515  - L'API `list` permet le parcours de tous les éléments d'une liste.
     16
    1617- 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.
    17 - 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 - Les allocateurs dynamiques utilisent l'espace libre de ces segments `data`.
    19 - L'application a 2 besoins distincts d'allocation dynamiques :
    20   1. l'allocation de variables dynamiques,
    21   1. l'allocation de piles pour les threads.
    22 - Les différences entre ces deux types de types d'allocation sont les suivantes :
    23   - 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).
    24   - 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).
     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.
     19  - Les allocateurs dynamiques utilisent l'espace libre de ces segments `data`.
     20  - L'application a 2 besoins distincts d'allocation dynamiques :
     21    1. l'allocation de variables dynamiques,
     22    1. l'allocation de piles pour les threads.
     23  - Les différences entre ces deux types de types d'allocation sont les suivantes :
     24    - 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).
     26
    2527- Nous avons donc 3 allocateurs dans kO6 :
    26   - 1 allocateur de piles utilisateurs pour les threads
    27   - 1 allocateur de variables dynamiques pour l'application
    28   - 1 allocateur de variables dynamiques pour le noyau
    29 - L'allocateur de piles utilisateur et l'allocateur de variables doivent partager la zone libre laissée dans la section `.data`. L'allocateur de pile utilise la partie haute de la section `.data` et l'allocateur de variable utilise la partie basse.
    30 - L'allocateur de pile pour les threads
     28  - un allocateur de piles utilisateurs pour les threads
     29  - un allocateur de variables dynamiques pour l'application
     30  - un allocateur de variables dynamiques pour le noyau
     31  - L'allocateur de piles utilisateur et l'allocateur de variables doivent partager la zone libre laissée dans la section `.data`. L'allocateur de pile utilise la partie haute de la section `.data` et l'allocateur de variable utilise la partie basse.
     32
     33- L'allocateur de piles pour les threads
    3134  - C'est le plus simple. Il alloue les piles en réservant un segment de taille fixe (`USTACK_SIZE` défini dans `common/usermem.h`) à partir du haut du segment data, tant que cela n'entre pas en collision avec l'allocateur de variables dynamiques.
    3235  - Lors de la libération, la pile est mise dans une liste chaînée triée par adresses décroissantes en utilisant l'API `list`.
     
    3437  - Le tri des piles libres permet d'augmenter la probabilité d'usage des piles placées en haut du segment `.data`.
    3538  - Quand une pile est libérée et qu'elle est la plus basse en adresse. Le segment qu'elle occupait est rendu au noyau.
     39
    3640- L'allocateur de variables dynamiques pour l'application
    3741  - 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.
     
    5256    - La fonction vérifie que l'adresse en argument a bien été allouée par `malloc()`.
    5357    - Elle marque le bloc pointée comme `vide`.
     58
     59- L'allocateur de variables dynamiques pour le noyau
     60  - 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.
     62  - Le noyau doit pouvoir allouer et libérer ses objets très rapidement.
     63  - L'allocateur d'objets gère des listes d'objets libres de même taille.
     64  - Pour allouer un objet, l'allocateur se contente de prendre le premier objet libre dans la liste des objets libres de la bonne taille.
     65  - 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
    5468 
    5569