Département INFormatique 
 CSC4508/M2 : Concepts des systèmes d'exploitation et mise en œuvre sous Unix


   Évaluation



TÉLÉCOM SudParis 2ème année

TP Noté CSC4508/M2 du 17/06/16

Corrigés

Modalités

Durée : 1 heure 30

Tous documents autorisés.

Le sujet est délibérément trop long pour que toutes les questions puissent être traitées en 1h30. Le barême prévu tient compte de cela: le TP est noté sur 30. Vous pouvez donc choisir de vous concentrer sur certaines questions sans chercher à traiter l'ensemble du sujet.
Les questions sont indépendantes les unes des autres. Aussi, n'hésitez pas à lire tout le sujet avant de commencer pour déterminer l'ordre dans lequel vous souhaitez traiter les questions.
Le barème est donné à titre indicatif des poids entre les différentes questions.

La « livraison » de votre travail en fin de TP noté se fera par remontée sous Moodle (rubrique « TP noté de 1 heure 30 ») du fichier d'extension tgz constitué de la manière suivante :
cd votreRepertoireDeTravailPourCSC4508M2
tar cvfz ${USER}.tgz ${USER}_TPNote2016Session2

Préparation

	    cd votreRepertoireDeTravailPourCSC4508M2
	    wget http://www-inf.it-sudparis.eu/COURS/CSC4508/Current/Documents/ExoCoursSys/TPNote2016Session2/WWW/tPNote2016Session2.tgz
	    tar xvfz tPNote2016Session2.tgz
	    mv TPNote2016Session2 ${USER}_TPNote2016Session2
	    cd ${USER}_TPNote2016Session2
	  

Question 1 : smart pointers (10 points)

Les smart pointers sont des pointeurs conçus pour faciliter la gestion mémoire en C++. Le concept est assez similaire à la gestion mémoire faite par Java: à chaque copie d'un pointeur, on incrémente un compteur de références. Le compteur est décrémenté lorsqu'une copie est détruite. Si le compteur tombe à zéro (et donc, qu'il ne reste aucune copie du pointeur), la zone pointée par le pointeur peut être libérée.

Le fichier Q1/smart_pointers.c implémente un système de smart pointers simple. Ce système est utilisé par le programme Q1/test_smart_pointers.c.

Question 1.1

Dans le fichier Q1/Q1.1/smart_pointers.c, implémentez la fonction smart_pointer_free.

Question 1.2

Répondez à cette question dans le fichier Q1/reponses1.txt.

Afin de vérifier l'implémentation des smart pointers et leur utilisation, quel outil peut on utiliser pour analyser les accès mémoire ? Donnez la ligne de commande permettant d'analyser les accès mémoire du programme test_smart_pointers.

Question 1.3

Répondez à cette question dans le fichier Q1/reponses1.txt.

L'implémentation actuelle des smart pointers n'est pas thread-safe. Quel problème peut survenir avec une application multi-threadée utilisant ces smart pointers.

Question 1.4

Dans le fichier Q1/Q1.4/smart_pointers.c, corrigez l'implémentation des smart pointers afin de la rendre thread-safe.

Question 2 : Capitaine de soirée (10 points)

Le capitaine de soirée est la personne qui, dans un groupe se déplaçant en automobile pour se rendre à une fête, promet de rester sobre et de conduire au retour.

Le but de cet exercice est de simuler l'organisation d'un covoiturage et la désignation d'un capitaine de soirée.

On considère que chaque participant est modélisé par un thread exécutant l'algorithme suivant:

attendre_que_la_voiture_soit_remplie();
désigner_un_capitaine_de_soirée();
aller_à_la_fête();
si(je_suis_capitaine_de_soirée) alors
faire_la_fête_sobrement();
sinon
faire_la_fête();
finsi
attendre_que_la_voiture_soit_remplie();
rentrer_se_coucher();

Pour chacune des questions ci-dessous :

  • Répondez dans le fichier Q2/reponse2.txt.
  • Le langage algorithmique utilisé n'a pas besoin de respecter strictement la syntaxe apprise en première année. L'essentiel est qu'il soit lisible par le correcteur et sans ambiguïté.

Les questions 2.1 et 2.2 sont indépendantes.

Question 2.1

On souhaite dans un premier temps implémenter la fonction "attendre_que_la_voiture_soit_remplie()" à partir d'un ou plusieurs sémaphores. Cette fonction attend que 5 threads soient montés dans la voiture. Cette barrière est un point de synchronisation qui garantit que N tâches sont arrivées à un point spécifique. Lorsqu'un thread atteint la barrière, il attend jusqu'à ce que le nombre de threads requis soit atteint.

À l'aide de sémaphores (dont vous indiquerez les valeurs initiales), d'éventuelles variables additionnelles (dont vous indiquerez si elles sont partagées entre les threads ou si elle sont locales, ainsi que leurs valeurs initiales), et d'opérations P() et V(), écrivez l'algorithme de attendre_que_la_voiture_soit_remplie().

Question 2.2

On souhaite maintenant implémenter la fonction désigner_un_capitaine_de_soirée(). Cette fonction, appelée par les 5 passagers d'une voiture désigne l'un des passager pour qu'il soit le capitaine de soirée. Chaque processus passager possède une variable locale booléenne je_suis_capitaine_de_soirée qui doit être positionnée à vrai ou faux de manière à ce qu'en sortant de la fonction, un et seul un des 5 threads soit capitaine de soirée. Le choix du thread désigné capitaine est libre.

À l'aide de sémaphores (dont vous indiquerez les valeurs initiales), d'éventuelles variables additionnelles (dont vous indiquerez si elles sont partagées entre les threads ou si elle sont locales, ainsi que leurs valeurs initiales), et d'opérations P() et V(), écrivez l'algorithme de désigner_un_capitaine_de_soirée().

Question 3 : My Find (10 points)

Le but de cet exercice est de développer une application capable d'examiner les fichiers d'une arborescence. Pour cela, nous vous fournissons le squelette de programme Q3/my_find.c. Ce programme utilise popen("ls <dirname>", "r") pour obtenir la liste des entrées d'un répertoire. Le but de cet exercice est d'étendre ce programme afin de traiter chacunes de ces entrées.

Question 3.1

Expliquez (dans le fichier Q3/reponses3.txt) le fonctionnement de la commande popen("ls <dirname>", "r").

Question 3.2

Complétez, dans Q3/Q3.2/my_find.c, le programme afin d'afficher, pour chaque entrée un message du type "new entry: fichier1.txt". Voici un exemple d'exécution attendue :

$ ./my_find .
new entry: 'Makefile'
new entry: 'Makefile~'
new entry: 'my_find'
new entry: 'my_find.c'
new entry: 'my_find.c~'

Question 3.3

Complétez votre programme (dans Q3/Q3.3/my_find.c) afin d'afficher un message différent pour les repertoires. Par exemple:

$ ./my_find .
New file: ./Makefile
New file: ./Makefile~
New file: ./my_find
New file: ./my_find.c
New file: ./my_find.c~
New directory: ./Q3.2
New directory: ./Q3.3
New directory: ./Q3.4

Question 3.4

On souhaite maintenant parcourir récursivement les sous-répertoires. Complétez votre programme (dans Q3/Q3.4/my_find.c) afin qu'il crée, pour chaque répertoire, un nouveau processus exécutant la commande ./my_find <sous-répertoire>. Voici un exemple d'exécution attendue:

$ ./my_find .
Entering .
New file: ./Makefile
New file: ./Makefile~
New file: ./my_find
New file: ./my_find.c
New file: ./my_find.c~
New file: ./my_find_sujet.c
New directory: ./Q3.2
Entering ./Q3.2
New file: ./Q3.2/Makefile
New file: ./Q3.2/my_find.c
Leaving ./Q3.2
New directory: ./Q3.3
Entering ./Q3.3
New file: ./Q3.3/my_find.c
Leaving ./Q3.3
New directory: ./Q3.4
New file: ./Q3.4/my_find.c
Leaving ./Q3.4
Leaving .




Page mise à jour le 13 juin 2016