Portail informatique Année 2018 – 2019

PAAM – Programmation avancée des architectures multicoeurs

Le but de ce mini-projet est de construire un ramasse-miettes conservatif et incrémental en C. L'algorithme d'allocation vous est fourni, il correspond à l'algorithme proposé par Boehm pour hasher les objets. On vous demande de développer la collection et on vous demande de rendre votre collecteur incrémental. Le tme va se dérouler en deux étapes. Dans un premier temps, vous allez réaliser un collecteur stoppe-le-monde. Dans un second temps, vous le modifierez pour respecter l'invariant tri-couleurs de Steel.

Le squelette du tme se trouve ici. Le squelette n'est pas prévu pour s'exécuter sur d'autres plate-formes que Linux. Vous trouverez dans ce squelette les fichiers suivants:
  • alloc.h : ce fichier définit l'interface de l'allocateur. Vous devrez enrichir la structure struct object_header de façon à pouvoir collecter l'objet.
  • alloc.c : ce fichier contient le code de l'allocateur. Normalement, vous ne devriez pas avoir besoin de modifier ce fichier.
  • gc.h : ce fichier définit l'interface du ramasse-miettes. Normalement, vous ne devriez pas avoir besoin de modifier ce fichier.
  • gc.c : ce fichier contient le code du ramasse-miettes. Vous devez compléter le code qui se trouve dans ce fichier. Un certain nombre de fonctions et d'opération vous sont toutefois fournies pour vous aider, en particulier, l'enregistrement des threads dans une liste chaînée et la définition de variables locales à des threads (Thread Local Storage). Vous aurez aussi à enrichir la structure thread_descriptor pour y placer toutes les données que vous jugerez nécessaires à la construction d'un ramasse-miettes incrémental.
  • main.c : ce fichier contient un exemple applicatif. Vous ne devriez pas avoir à modifier ce fichier. L'exemple effectue de nombreuses allocations et écritures en multi-threads.
  • debug.h : ce fichier contient la définition de la fonction dprintf qui permet de faire du debuging. Il est vivement conseillé d'utiliser cette fonction.
  • Makefile : le Makefile du projet. Par défaut, le debug est activé dans le Makefile. Si vous souhaitez enlever les informations de debugage, il faut soit appeler make avec le paramètre DEBUG=0, soit modifier la variable DEBUG dans le fichier. Les targets utiles du Makefile sont: clean (nettoie les fichiers intermédiaires), distclean (nettoie tout), tidy (nettoie les fichiers de backup de emacs et autre), et all (construit le projet).
La première étape du tme est la construction d'un ramasse-miettes marque-et-balaye bloque-le-monde. Vous devrez lancer une collection régulièrement, synchroniser les mutateurs pour qu'ils trouvent les racines de collection dans la pile, parcourir le graphe des objets atteignables et finalement libérer les objets qui n'ont pas été atteints. Vous devrez remplir la fonction writeBarrier et modifier le ramasse-miettes pour le rendre concurrent en maintenant l'invariant tri-couleurs de Steel.