Le projet en quelques mots
Lorsqu'un programme a besoin de stocker temporairement des données, il demande de la mémoire au système. MyMalloc reproduit le mécanisme qui organise ces demandes en arrière-plan.
Le projet consistait à recréer les quatre fonctions principales de la bibliothèque standard - malloc, free, calloc et realloc - sans utiliser l'allocateur fourni par le système. La mémoire obtenue auprès de Linux est découpée en blocs, distribuée aux programmes, puis réutilisée lorsqu'elle est libérée.
Comment ça fonctionne
Architecture générale du système
Fonctions exposées
Gestionnaire Central
Référence globale
Tête de la liste des blocs
Initialisé automatiquement (constructor)
Gestion des Blocs
Recherche first-fit
Découpage d'un bloc
Réunion des blocs libres
Gestion par liste doublement chaînée
Interface Système
Allocation pages
Libération pages
Alignement mémoire
Gestion pages
Réservation et restitution des pages mémoire auprès de Linux
Structure des blocs
struct blk_meta {
struct blk_meta *prev; // Bloc précédent dans la liste
struct blk_meta *next; // Bloc suivant dans la liste
int is_free; // 1=libre, 0=occupé
size_t size; // Taille des données utilisateur
char data[]; // Début des données utilisateur (flexible array)
};
Points techniques
Réutilisation des blocs
La recherche first-fit sélectionne le premier bloc libre suffisamment grand. Celui-ci peut être découpé afin de conserver l'espace restant pour une allocation ultérieure.
Libération de la mémoire
Lors d'un appel à free(), les blocs libres voisins situés sur une même page sont fusionnés. Les grandes zones devenues inutiles peuvent ensuite être rendues au système avec munmap().
Synthèse du Projet
Travail réalisé
J'ai développé une bibliothèque partagée libmalloc.so qui expose malloc, free, calloc et realloc. L'allocateur organise les zones obtenues avec mmap() dans une liste doublement chaînée, aligne les demandes, réutilise les blocs libres et les fusionne lorsque cela est possible. Un test en C vérifie plusieurs suites d'allocations, de libérations et de redimensionnements.
Ce que le projet m'a apporté
Ce projet m'a permis de comprendre comment la mémoire d'un programme est organisée derrière des fonctions courantes. J'y ai approfondi les pointeurs, l'alignement, les appels système et les bibliothèques partagées. J'ai également appris à déboguer un allocateur avec GDB et Valgrind, notamment lorsqu'il est chargé avec LD_PRELOAD.