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


Ignore:
Timestamp:
Mar 26, 2022, 1:48:45 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AS6-TME-B6

    v12 v13  
    3535  - 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.
    3636- L'allocateur de variables dynamiques pour l'application
    37   - Cet allocateur dispose d'un segment d'adresse libre aligné sur les lignes de caches.
    38   - L'allocateur gère des blocs.
     37  - 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.
     38  - l'adresse limite du `heap` est nommée `heap_end`
     39  - L'allocateur gère des blocs (il fallait bien donner un nom...)
    3940    - Un bloc est un segment d'adresse aligné sur les lignes de caches.
    40     - Un bloc est défini par une taille (en nombre de lignes de cache) et un état vide ou plein
     41    - Un bloc est défini par une taille (en nombre de lignes de cache) et un état vide ou plein
     42  - Au début, le heap n'a pas de place, alors il demande de la place au kernel avec l'appel système `sbrk_heap` qui lui octroie de l'espace en déplaçant `heap_end` vers le haut (tant que cela n'entre pas en collision avec les piles de threads qui utilisent le haut de la section `.data`.
     43  - Cette demande de place a pour effet de créer un bloc vide.
     44  - L'API de cet allocateur est `void * malloc(size)` et `void free(void *)`
     45  - `void * malloc(size)`
     46    - La fonction parcourt l'ensemble des blocs en commençant par le tout premier à la recherche d'un bloc vide assez grand pour contenir `size`.
     47    - Si la place restante est plus petite qu'une ligne de cache, alors l'ensemble du bloc est marqué comme `plein`.
     48    - Sinon, le bloc est scindé en deux blocs, le premier `plein` et le second `vide`.
     49    - 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.
     50    - Quand l'allocateur a trouvé un bloc, il rend un pointeur dessus.
     51  - `void free(void *)`
     52    - La fonction vérifie que l'adresse en argument a bien été allouée par `malloc()`.
     53    - Elle marque le bloc pointée comme `vide`.
     54 
    4155
    4256