|
|
TÉLÉCOM SudParis 2ème
année
TP Noté CSC4508/M2 du 21/06/12
(2ème session)
(Corrigés)
Modalités
Durée : 1 heure 30
Tous documents autorisés.
Les questions 1, 2 et 3 sont indépendantes. 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}_TPNote2012Session2
Préparation
cd votreRepertoireDeTravailPourCSC4508M2 cp ~trahay_f/Cours/CSC4508/tPNote2012Session2.tgz . tar xvfz tPNote2012Session2.tgz mv TPNote2012Session2 ${USER}_TPNote2012Session2
cd ${USER}_TPNote2012Session2
Question 1 : Implémentation d'un verrou (12 points)
Dans une application parallèle, plusieurs threads ont besoin d'accèder
à un tableau t. Certains threads sont chargés de consulter le tableau
en appelant la fonction f1:
double t[SIZE];
void f1 ( ) {
acces_en_lecture( t );
}
D'autres threads peuvent modifier ce tableau en appelant la fonction
f2:
void f2 ( ) {
acces_en_ecriture( t );
}
Pour chacune des questions ci-dessous, répondez dans le fichier
Q1/reponse1.txt ou bien sur votre copie (dans ce dernier
cas, indiquez dans le fichier Q1/reponse1.txt « Réponse
sur copie »).
- Expliquez le problème que peuvent poser ces accès concurrents au
tableau.
- Implémentez à l'aide de sémaphores (dont vous indiquerez les
valeurs initiales), d'éventuelles variables additionnelles (dont
vous indiquerez les valeurs initiales), et d'opérations P() et V(),
une solution permettant de résoudre ce problème.
- L'accès simultané par plusieurs threads à la fonction f1 ne pose
pas de problème car les accès se font en lecture. Implémentez à
l'aide de sémaphores (dont vous indiquerez les valeurs initiales),
d'éventuelles variables additionnelles (dont vous indiquerez les
valeurs initiales), et d'opérations P() et V(), une autre solution
permettant à plusieurs threads d'accèder en lecture au tableau,
mais empêchant les écritures lorsqu'un autre thread lit ou écrit
dans le tableau.
---beginCorr
Barème : Q1.1: 3 points, Q1.2: 3 points, Q1.3: 6 points
- Puisque plusieurs threads peuvent modifier le tableau
simultanément, certaines modifications risquent d'être perdues. Par
exemple, si acces_en_ecriture(t) comporte l'instruction t [2] ++;
et que t[2] vaut 0, l'accès par 2 threads à cette instruction
risque de ne pas incrémenter t[2] deux fois (ie. t[2] risque de
valoir 1 au lieu de 2). Par ailleurs, les threads accèdant en
lecture au tableau risquent de lire une valeur incohérente si un
autre thread modifie le tableau au même moment.
- Variable utilisée: sémaphore mutex (initialisé à 1)
void f1() {
P(mutex);
acces_en_lecture(t);
V(mutex);
}
void f2() {
P(mutex);
acces_en_ecriture(t);
V(mutex);
}
void fonction1 () {
/* read_lock() */
P(lock_lecteur); // protege la modification de nb_lecteurs
nb_lecteurs++;
// le premier lecteur s'assure qu'aucun ecrivain n'ecrit
si(nb_lecteurs == 1)
P(lock_ecrivains);
fsi
// else : on sait qu'il y a deja un lecteur, donc il n'y a pas
d'ecrivain
V(lock_lecteur);
acces_en_lecture();
/* read_unlock() */
P(lock_lecteur); // protege la modification de nb_lecteurs
nb_lecteurs--;
si(nb_lecteurs == 0) // on est le dernier lecteur, on permet aux
ecrivains d'ecrire
V(lock_ecrivains);
fsi
V(lock_lecteurs);
}
void fonction2 () {
/* write_lock() */
P(lock_ecrivain);
acces_en_ecriture();
/* write_unlock() */
V(lock_ecrivain);
}
---endCorr
Question 2 : Compter le nombre de fichiers d'un répertoire (8
points)
On souhaite écrire le programme compter qui
permer de compter le nombre de fichiers du répertoire courant. Par
exemple :
$ ls
toto
un.c deux.c
trois.php quatre.c cinq.php
La commande suivante doit donner:
$
./compter
il y a 5 fichiers
On considère que le répertoire ne contient pas de fichier comportant
un espace.
Modifiez le programme compter.c
pour qu'il crée 1 processus exécutant la commande ls en redirigeant le
résultat de la commande dans un tube. Le processus père doit compter le
nombre de mots sortant du tube.
---beginCorr
Voir le fichier compter.corrige.c
---endCorr
|
|