TÉLÉCOM SudParis 2ème
année
TP Noté CSC4508/M2 du 30/06/17
(Corrigés)
Modalités
Durée : 1 heure 30
Tous documents autorisés.
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}_TPNote2017Session2
Préparation
cd votreRepertoireDeTravailPourCSC4508M2
wget http://www-inf.it-sudparis.eu/COURS/CSC4508/Current/Documents/ExoCoursSys/TPNote2017Session2/WWW/tPNote2017Session2.tgz
tar xvfz tPNote2017Session2.tgz
mv TPNote2017Session2 ${USER}_TPNote2017Session2
cd ${USER}_TPNote2017Session2
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/cmocka/install/lib
Pour les utilisateurs de Mac, vous devez également faire les instructions suivantes:
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$(pwd)/cmocka/install/lib
cd cmocka
rm -Rf Build/*
rm -Rf install
cd Build
cmake -DCMAKE_INSTALL_PREFIX=../install -DCMAKE_BUILD_TYPE=Debug ..
make
make install
cd ../..
Préambule
Les 3 exercices de ce TP noté s'appuient sur les fichiers vector.* qui
implémentent un ensemble de fonctions permettant de manipuler des
vecteurs de chaînes de caractères. Par exemple, après avoir exécuté la
séquence d'instructions suivante :
struct vector_t *pv = newVec();
pushBack(pv, "abc");
pushBack(pv, "ab");
pushBack(pv, "a");
la mémoire d'un processus contient les informations suivantes :
De ce fait, si le processus exécute getElem(pv, 0) , cette fonction
renvoie la chaîne de caractères "abc" .
Les exercices sont indépendants. Pour chaque exercice, vous avez à votre disposition :
- Les fichiers
vector.h et vector.c
implémentant des fonctions permettant de manipuler des
vecteurs. Seul le fichier vector.c
est à modifier.
- Un programme
testUnitaire.c pour tester
les différentes fonctions implémentées dans vector.c
Question 1 : Création et destruction de vecteurs (8 points)
Question 1.1
Dans la fonction newVec , pourquoi n'a-t-on pas écrit:
struct vector_t v = {0, NULL};
return &v;
qui aurait été plus simple ?
Répondez dans le fichier Q1/reponses1.txt .
---beginCorr (1 points)
return &v retourne l'adresse d'une
variable locale. Cette adresse n'est plus valable dès la
sortie de la fonction.
---endCorr
Question 1.2
Toujours dans NewVec , quel est l'intérêt
d'utiliser calloc au lieu de malloc ?
Répondez dans le fichier Q1/reponses1.txt .
---beginCorr (1 point)
calloc garantit que toute la zone memoire
allouee est initialisee a 0. En utilisant cette fonction,
il est donc inutile d'initialiser les champs nbElem
et elem de la structure allouée.
---endCorr
Question 1.3
La fonction pushBack appelle actuellement realloc . Modifiez
cette fonction pour qu'elle n'utilise que malloc . (NB: vous
pouvez tester votre modification en exécutant les tests unitaires
./testsUnitaires )
Par ailleurs, expliquez (dans le fichier Q1/reponses1.txt )
quel est l'avantage, pour cette fonctionpushBack ,
de la solution à base de realloc par
rapport à la solution à base de malloc .
---beginCorr (3 points)
Corrigé : vector_corrige_Q1.c.
---endCorr
Question 1.4
Implémentez la fonction deleteVector .
---beginCorr (3 points)
Corrigé : vector_corrige_Q1.c.
---endCorr
Question 2: multi-threading (7 points)
Question 2.1
On souhaite pouvoir utiliser les fonctions pushBack et
getElem depuis plusieurs threads de manière concurrente.
Dans le fichier Q2/reponses2.txt , donnez, en
justifiant, le type de problème de synchronisation
rencontré entre ces deux fonctions si l'on souhaite que le
parallélisme entre les threads soit maximal.
Modifiez le code pour que le parallélisme entre les threads
soit maximal.
---beginCorr
-
Il s'agit ici d'un problème de type lecteur/rédacteur: les
appels à
getElem consultent le vecteur, et
les appels à pushBack écrivent dans le vecteur. (2 points)
-
Corrigé : vector_corrige_Q2.c (5 points).
---endCorr
Question 3: Chargement/sauvegarde sur disque (6points)
On souhaite pouvoir sauvegarder un vecteur dans un fichier
ou charger un vecteur stocké dans un fichier. Pour cela,
on utilise le format de fichier suivant:
- Les 4 premiers octets contiennent le nombre, écrit en
binaire, d'éléments du vecteur
- Ensuite, pour chaque élément du vecteur, il y a 4
octets contenant la longueur, écrite en binaire, que doit
avoir la zone mémoire pour stocker la chaîne de caractères
qui va être lue ensuite (NB: cette longueur prend en
compte le '\0' final), puis les octets de la chaîne de
caractères (y compris le '\0' final).
Question 3.1
Implémentez la fonction loadVec
---beginCorr (3 points)
Corrigé : vector_corrige_Q3.c
---endCorr
Question 3.2
Implémentez la fonction saveVec .
---beginCorr (3 points)
Corrigé : vector_corrige_Q3.c
---endCorr
|