Département INFormatique 
 CSC4508/M2 : Conception et programmation des systèmes centralisés


   Évaluation



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

TP Noté CSC4508/M2 du 19/05/16

Corrigés

Modalités

Durée : 3 heures

Tous documents autorisés.

Les questions 1, 2 et 3 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 3 heures ») du fichier d'extension tgz constitué de la manière suivante :
cd votreRepertoireDeTravailPourCSC4508M2
tar cvfz ${USER}.tgz ${USER}_TPNote2016

Préparation

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

Question 1 : Débugger un code (6.5 points)

Le fichier question1.c, qui implémente quelques fonctions comporte plusieurs bugs. Le but de cet exercice est de les identifier et de proposer des correctifs.

Question 1.1

Dans le fichier Q1/reponses1.txt, indiquez, en justifiant votre réponse, le nombre d'octets que la procédure writeBytes écrit dans le fichier associé au descripteur fd.

Question 1.2

La fonction newFilledStruct compile avec un warning.
  • Expliquez (dans le fichier Q1/reponses1.txt) ce warning (surtout pourquoi cela pose un problème à l'appelant de newFilledStruct)
  • Corrigez le problème en modifiant le fichier Q1/Q1.2/question1.c.

Question 1.3

La procédure writeBytes contient deux bugs. Le premier bug explique que, quand un même programme appelle fréquemment writeBytes, à un moment le programme s'arrête sur l'assert(buf != NULL).

Dans le fichier Q1/reponses1.txt,

  • Expliquez le bug et la raison de cet arrêt sur assert.
  • Proposez une correction
  • Expliquez l'autre bug.
  • Proposez-en une correction

Question 1.4 (difficile)

La procédure createThread contient un bug. Dans le fichier Q1/reponses1.txt,
  • Expliquez ce bug.
  • Décrivez le principe d'une correction qui ne fait pas de malloc (NB : on ne vous demande pas de coder cette solution)

Question 2 : Jobs. (8 points)

Le programme jobs.c crée NJOBS jobs qui doivent être traités par la fonction process_job(). Le résultat de chaque job est écrit dans le fichier results.dat de façon à ce que le fichier contienne, à la fin de l'exécution du programme:

AAAABBBBCCCCDDDDEEEE...XXXX

où AAAA est le résultat (écrit en binaire) du job 0, BBBB le résultat du job 1, etc.

La liste des jobs à traiter est dans la liste chaînée jobs qui pointe vers le premier élément de la liste (ou NULL si la liste ne contient aucun élément). Chaque élément pointe vers l'élément suivant à traiter (sauf le dernier, qui pointe sur NULL).

A la fin du programme, la fonction check_result vérifie que le contenu du fichier est correct.

Question 2.1

Dans le répertoire Q2/Q2.1, complétez le programme de manière à ce que les résultats des jobs soient écrits dans le fichier "results.dat". Il vous est demandé ici de compléter les fonctions suivantes:

  • init_workers(): ajouter le code permettant d'ouvrir le fichier
  • finalize_workers(): ajouter le code permettant de fermer le fichier
  • save_result(): ajouter le code permettant d'écrire le résultat d'un job (j->res) dans le fichier

La fonction check_result, appelée à la fin du programme vérifie que chaque job a écrit le résultat au bon endroit du fichier.

Question 2.2

On souhaite maintenant paralléliser le traitement des jobs afin d'exploiter les processeurs multi-coeurs des machines.

Recopiez les fichiers que vous avez modifiés lors de la question 2.1 dans le répertoire Q2/Q2.2. Complétez ensuite ce code afin que:

  • La fonction init_workers crée MAX_PARALLEL_JOBS threads
  • Les threads attendent que des jobs soient soumis pour les traiter
  • La fonction finalize_workers signifie aux threads qu'il n'y a plus de job à soumettre (par exemple, en soumettant un job avec un 'identifiant particulier, ou en utilisant une primitive de synchronisation) , et qu'elle attende que tous les threads aient fini de traiter les jobs soumis.
  • Tous les accès concurrents à des structures de données ou ressources partagées soient protégés correctement.

Question 3 : Parcours d'une arborescence (5.5 points)

Le programme browse_dir compte le nombre de fichiers dans un répertoire (NB: le programme ignore les liens symboliques vers des fichiers). Pour lancer ce programme, il suffit de lui donner un répertoire en paramètre:

$ ./browse_dir /home/trahay
Il y a 32 fichiers dans le répertoire /home/trahay

Actuellement, le programme n'inclut pas les fichiers stockés dans les sous-répertoires du répertoire passé en argument. Le but de l'exercice est de modifier le programme pour que ce soit le cas.

Question 3.1

Dans le fichier Q3/Q3.1/browse_dir.c, modifiez la fonction count_files afin qu'elle compte tous les fichiers d'un répertoire et de ses sous-répertoires, de manière récursive.

Question 3.2

Copiez browse_dir.c dans le répertoire Q3/Q3.2, puis modifiez le afin qu'il ne compte que les fichiers accessibles en écriture par l'utilisateur.





Page mise à jour le 18 mai 2016