|
|
TÉLÉCOM SudParis
2ème
année
TP Noté CSC4508/M2 du 22/06/11
(2ème session)
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 TPNote2011Session2
Préparation
cd votreRepertoireDeTravailPourCSC4509M2 cp ~simatic/Cours/CSC4508/tPNote2011Session2.tgz . tar xvfz tPNote2011Session2.tgz cd TPNote2011Session2
Question 1 : De l'alignement des structures (6 points)
On considère le programme C suivant :
#include <stdlib.h>
typedef struct {
short aShort;
int anInt;
short aShort2;
}
__attribute__((packed,aligned(8))) MaStruct;
int main() {
MaStruct maStruct = {0,0,0};
maStruct.anInt = 1;
return EXIT_SUCCESS;
}
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 rôle de l'attribut packed dans __attribute__((packed,aligned(8))).
- Expliquez le rôle de l'attribut aligned(8) dans __attribute__((packed,aligned(8))).
- Sur un processeur Intel, ce programme s'exécute
parfaitement. En revanche, sur un processeur ARM d'ancienne génération, ce programme plante
au niveau de l'instruction maStruct.anInt
= 1; en faisant une « Erreur
d'accès mémoire ». Expliquez pourquoi.
- Quels changements proposez-vous dans ce programme pour que
l'instruction maStruct.anInt = 1; s'exécute correctement sur
processeur ARM ancienne génération ?
Question 2 : Le retour de La Trace du Hourra (4 points)
Dans
l'une des questions du TP noté de
2011 (session 1), nous avons étudié l'algorithme de
synchronisation des trains fonctionnant sur la montagne russe La Trace
du Hourra du Parc Astérix.
Rappels (que vous pouvez ne pas lire si vous vous souvenez du TP noté de 2011 [session 1])
La figure 1 modélise cette montagne russe. Elle est
constituée de 4 zones:
- zoneE est la
zone d'Embarquement où les passagers montent et descendent d'un
train. zoneE peut
contenir au maximum 2 trains.
- zoneA est la
zone d'Attente juste avant de pouvoir entrer dans zoneE. Elle ne peut contenir
qu'un train.
- zoneH est la
zone où un train monte avant de se lancer dans sa
descente infernale (c'est donc la zone des Hurlements où les
gens
crient « Help, je veux descendre ! Non, pas comme
çaaaaaaaa... »). Elle ne peut contenir qu'un train.
- zoneG est la
zone de Garage du train. Les trains y sont parqués avant
d'être injectés dans le circuit zoneE-zoneH-zoneA. NB : dans cet
exercice, on suppose qu'une
fois qu'un train est sorti de zoneG,
il n'y retourne plus jamais.
Figure 1 : Modélisation de la montagne russe
« La Trace du
Hourra »
Quand cette attraction fonctionne :
- Un train ne peut quitter zoneG que s'il y a de la place
dans zoneE.
- Un train ne peut quitter zoneE que si zoneH est vide.
- Un train ne peut quitter zoneH que si zoneA est vide.
- Un train ne peut quitter zoneA que s'il y a de la place
dans zoneE.
La question 2 proprement dite
Une
personne, que nous dénommerons Candide par la suite, a
proposé l'algorithme ci-dessous pour chaque train de cette
attraction. Noter que l'algorithme du corrigé du TP noté
de 2011 (session 1) et l'algorithme de Candide ne diffèrent que
par la valeur d'initalisation du sémaphore zoneE.
Semaphore zoneE
initialisé à 1; // Dans le corrigé du TP
noté
// de 2011 (session 1), le
// le sémaphore zoneE était
// initialisé à 2
et non à 1.
Semaphore zoneA
initialisé à 1;
Semaphore zoneH
initialisé à 1;
Procédure codeTrain()
afficher("Je suis dans
zoneG");dormirUnPeu();
P(zoneE);
Tant que VRAI faire
afficher("Je suis dans la zone
zoneE");dormirUnPeu();
P(zoneH)
V(zoneE);
afficher("Je suis dans la zone
zoneH");dormirUnPeu();
P(zoneA);
V(zoneH);
afficher("Je suis dans la zone
zoneA");dormirUnPeu();
P(zoneE);
V(zoneA);
Fin Tant que
Fin Procédure
- Expliquez pourquoi, quand le sémaphore zoneE est
initialisé à 1 (au lieu de 2), la zone zoneE ne peut
contenir qu'un seul train à la fois.
- Quand le sémaphore zoneE est initialisé
à 1 (au lieu de 2), si 3 trains sont injectés dans la
montagne russe, ces trois trains n'arrivent pas à circuler.
Expliquer pourquoi.
Question 3 : Simulation de La Trace du Hourra (10 points)
Candide, la personne évoquée à la question 2, a
développé un programme correspondant à son
algorithme
(cf. question 2). Dans ce programme, Candide crée NB_TRAINS
threads qui exécutent le code de codeTrain() ; le Tant que VRAI faire de l'algorithme est remplacé par un for (nbTours=0 ; nbTours<NB_TOURS ; nbTours++) pour que chaque thread s'arrête après
avoir fait NB_TOURS tours
de montagne russe.
Avant de rentrer dans le vif du sujet, exécutez ce programme :
cd Q3-1 ; make ; ./simulationTraceDuHourra
L'affichage permet d'observer la synchronisation des différents
trains.
Les trois sous-questions suivantes peuvent être traitées
les unes indépendamment des autres.
Question 3-1 : Plusieurs trains dans la zone zoneE (4,5
points)
Comme tous ses sémaphores étaient initialisés
à 1, Candide les a implémentés avec des
pthread_mutex.
Dans cette question, on souhaite pouvoir avoir deux trains en
même temps dans la zone zoneE et donc, comme on l'a vu à la question Q2, 3 trains qui circulent en
parallèle sur la montagne russe.
Dans simulationTraceDuHourra.c, mettez la valeur de NB_TRAINS à
3 et remplacez le pthread_mutex zoneE par un sémaphore de type sem_t
initialisé à (NB_TRAINS - 1).
Question 3-2 : Synchronisation du main avec les threads (3 points)
Dans le code actuel, le main
dort après avoir créé les threads.
Ainsi, Candide est sûr que tous les threads sont terminés
quand le main se
réveille et termine son exécution.
Dans simulationTraceDuHourra.c, remplacez sleep(20) par une attente
explicite de la fin de l'exécution des différents threads.
Question 3-3 : Où les threads deviennent des enfants (2,5 points)
Dans le code actuel, utilisez des enfants à la place des threads.
|