Projet Système
Consignes

Projet à réaliser en groupe de 5 étudiants (5 groupes par groupe de TD), encadré par Nathalie Furmento, Damien Martin-Guillerez et Brice Goglin. Les groupes devront être formés et indiqués par mail à votre encadrant et à Brice Goglin avant la fin de la première semaine (vendredi 17 février 2012).

Le langage de programmation devra être le C. L'utilisation d'une forge pour maintenir le projet est vivement recommandée.

Rapport et démonstration intermédiaires

Une démonstration des fonctionnalités implémentées devra être présentée lors de la 5ème séance (du 26 au 30 mars 2012). Un rapport intermédiaire (4-5 pages) sera de plus rendu 3 jours avant.

Rapport et soutenance de fin de projet

La soutenance finale aura lieu le mercredi 16 mai 2011. Elle durera environ 13 minutes suivies d'environ 5mn de questions, et consistera en une présentation sur vidéoprojecteur et une démonstration. Les ordinateurs de la salle pourront être utilisés pour la démonstration, mais il sera préférable de présenter une démo vidéoprojetée depuis un portable.

Un rapport d'environ 8 pages devra être rendu le mercredi 9 mai, au format PDF par mail à votre encadrant et à Brice Goglin. Le rapport décrira ce qui a été implémenté, comment et pourquoi. Il sera accompagné d'une archive tar.gz contenant tout le code source et un minimum de documentation permettant de compiler et tester le projet. Une version papier du rapport devra de plus être disponible le jour de la soutenance.

Les rapports et soutenance devront notamment expliquer comment vos tests montrent la validité du comportement de votre bibliothèque et indiquer les différents coûts que vous avez mesurés (voir la partie premiers objectifs ci-dessous). Inutile d'écrire des pages pour rappeler le sujet, il faudra se concentrer sur les choses utiles et prêtant à discussion (complexité, modification de l'interface de programmation, ...).

Soutenances

Le matin, groupes 1 et 4, avec Brice Goglin et Damien Martin-Guillerez:

L'après-midi, groupes 2 et 3, avec Brice Goglin et Nathalie Furmento:

Introduction

Ce projet vise à construire une bibliothèque de threads en espace utilisateur. On va donc fournir une interface de programmation plus ou moins proche des pthreads, mais en les exécutant sur un seul thread noyau. Les intérêts sont:


Mise en route

Pour commencer, on va construire un petit programme qui manipule différents threads sous la forme de différents contextes. On commencera par exécuter ce programme et comprendre comment il fonctionne (ne pas compiler avec -std=c89 ou -std=c99). Ensuite, on l'étendra pour manipuler plusieurs contextes à la fois et passer de l'un à l'autre sans forcément revenir dans le main à chaque fois. En clair, il faut montrer qu'on peut exécuter plusieurs tâches complexes et indépendantes en les découpant en morceaux et en entrelaçant l'exécution réelle de ses morceaux.

Premiers objectifs

L'objectif du projet est tout d'abord de construire une bibliothèque de gestion de threads proposant un ordonnancement coopératif (sans préemption). On devra donc tout d'abord définir une interface de threads permettant de créer, détruire, passer la main (éventuellement à un thread particulier), attendre la/une terminaison, ...
On commencera par l'interface proposée ici et on pourra éventuellement s'en écarter si nécessaire. On veillera cependant à rester relativement proche de pthread.h afin de pouvoir facilement comparer les deux implémentations avec des programmes similaires.
Le premier objectif sera d'être capable d'exécuter correctement ce programme d'exemple. On vérifiera que sa sortie est cohérente avec celle de la version pthread du même programme.

Il faudra ensuite notamment:


Objectifs avancés

Une fois ce travail de base réalisé, chaque groupe devra s'intéresser à certaines des idées suivantes:


Ressources

Notez que setjmp/longjmp sont une variante un peu plus hardcore de l'interface makecontext/swapcontext. Elle est souvent utilisée dans les implémentations "sérieuses", mais le principe reste le même.

Valgrind est très utile pour trouver les fuites ou corruption mémoire, mais il va falloir l'aider un peu en lui disant où se trouvent les piles de vos threads. Pour ce faire:

#include <valgrind/valgrind.h>
...

...
/* juste après l'allocation de la pile */
int valgrind_stackid = VALGRIND_STACK_REGISTER(context.uc_stack.ss_sp,
                                               context.uc_stack.ss_sp + context.uc_stack.ss_size);
/* stocker valgrind_stackid dans votre structure thread */
...

...
/* juste avant de libérer la pile */
VALGRIND_STACK_DEREGISTER(valgrind_stackid);
...
 
Updated on 2012/05/11.