Gestion de la mémoire par le noyau

La norme du langage C fournit une interface standardisée pour la gestion de la mémoire, dans la libc, principalement le duo malloc/free.

C'est le compilateur C qui doit transformer cette interface en une série d'appels système, dépendant de l'OS. On regarde par exemple comment c'est fait sous Unix.

  1. La commande strace (et sa variante truss sous Solaris) sert à savoir quels sont les appels système utilisés pendant l'exécution d'un programme. Il s'agit donc de regarder les intercations du programme avec le noyau (NB: ce n'est pas le même genre de diagnostic que fournit un débugguer comme gdb qui se place au niveau du langage C, ou bien adb qui est au niveau assembleur.)
    Exercice : regarder pour les programmes C les plus simples possibles quels sont les appels système utilisés.
    On en trouve pricipalement deux pour la gestion de la mémoire : brk qui fixe la taille du segment de données, et mmap qui fait se correspondre un fichier et la mémoire.
  2. Utiliser mmap pour faire de la copie de fichiers. Comparer la vitesse d'exécution par rapport à une boucle read/write.
    Corrigé
  3. Faire sa propre bibliothèque malloc en n'utilisant que l'appel système brk. On programmera juste les fonctions Malloc et Free.
    NB: c'est moins simple qu'il n'y paraît au premier abord.
  4. Programmer les exercices du TP 10 en utilisant mmap avec l'option MAP_SHARED et comparer les deux approches.
    Sous Solaris, /tmp et le swap sont sur une même partition, plus rapide d'accès que les partitions habituelles. Est-ce perceptible avec votre programme ?