TP4 : Allocation dynamique
Le but de ce TP est d’implémenter un gestionnaire de mémoire dynamique en suivant les principes vus
en cours : free-list, recherche first-fit, etc.
1 Prise en main du code fourni
Exercice Téléchargez et décompressez l’archive correspondant à ce TP. Dans le répertoire obtenu,
tapez make pour compiler le code puis ./main pour l’exécuter. Vous devez obtenir approximativement
l’affichage suivant :
heap_base = 0x101090000
block at 0x101090000: header=0x00000050 size=80 flags=0 (free)
block at 0x101090050: header=0x00000050 size=80 flags=0 (free)
block at 0x1010900a0: header=0x00000050 size=80 flags=0 (free)
block at 0x1010900f0: header=0x00000050 size=80 flags=0 (free)
block at 0x101090140: header=0x00000050 size=80 flags=0 (free)
block at 0x101090190: header=0x00000190 size=400 flags=0 (free)
heap_end = 0x101090320
Remarques
— Vous pouvez aussi prendre l’habitude de taper par exemple make && ./main , ce qui signifie
«d’abord exécuter make puis, si ça s’est bien passé, exécuter ./main ensuite».
— L’archive est composée de trois fichiers. L’allocateur proprement dit est implémenté dans mem.c,
et son API utilisateur est décrite dans mem.h. Le fichier main.c représente une application.
Exercice Ouvrez le fichier main.c dans votre éditeur de texte préféré. Le rôle de ce programme
est uniquement de simuler une application aux yeux du gestionnaire mémoire. Il ne fera donc rien
d’intéressant à part de demander à allouer et à désallouer des blocs de mémoire. Durant le TP, vous
aurez souvent à modifier ce programme pour provoquer, depuis l’extérieur, différents comportements de
votre allocateur. Commencez donc par décommenter la fin du programme, puis recompilez et exécutez
de nouveau.
Constatez que l’un des blocs est maintenant indiqué comme occupé.
Exercice Ouvrez et lisez le fichier mem.h, qui décrit l’interface entre l’application et le gestionnaire
mémoire. Posez des questions sur ce que vous ne comprenez pas. Cette interface est constituée de
plusieurs fonctions :
— mem_init() permet d’initialiser le gestionnaire mémoire. L’application doit appeler cette fonction
une seule fois, au début de l’exécution.
— mem_alloc(int64_t length) permet de demander l’allocation d’une zone de mémoire. Cette
fonction renvoie l’adresse de début de la région, ou NULL en cas d’erreur.
— mem_release(void *ptr) permet de libérer une zone de mémoire. Le pointeur doit corres-
pondre à une zone préalablement allouée avec mem_alloc().
— mem_show_heap() est là juste pour vous aider à débugger. Elle affiche le contenu du tas, en
détaillant les informations disponibles sur chaque bloc.
Remarques
— Vous ne devez pas modifier le fichier mem.h.
— Toutes les tailles que vous manipulerez dans ce TP seront des variables de type int64_t.
N’utilisez pas de variables int sous peine d’avoir des bugs difficiles à diagnostiquer.