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 | |