struct blk_meta {
    struct blk_meta *prev;
    struct blk_meta *next;
    int is_free;
    size_t size;
    char data[];
};

void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
S5 - 2024 1 semaine intensive

MyMalloc

Réimplémentation en C des fonctions utilisées par les programmes pour réserver, redimensionner et libérer de la mémoire.

C99 Programmation système mmap / munmap Bibliothèque partagée

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

malloc() free() realloc() calloc()

Gestionnaire Central

global_allocator
Référence globale
blk_allocator
Tête de la liste des blocs

Initialisé automatiquement (constructor)

Gestion des Blocs

find()
Recherche first-fit
scission()
Découpage d'un bloc
fusion()
Réunion des blocs libres

Gestion par liste doublement chaînée

Interface Système

mmap()
Allocation pages
munmap()
Libération pages
align()
Alignement mémoire
page_begin()
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.

Projet précédent MyBitTorrent Tous les projets Projet suivant MyFind