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


    Évaluation



TELECOM & Management SudParis
TELECOM SudParis 2ème année

TP Noté CSC4508/M2 du 19/06/08

(2è session)

(Corrigés)

Modalités

Durée : 1 heure de préparation et 1 1/2-heure d'oral

Tous documents autorisés.
---beginCorr
Principes de notation :
  • Les questions 1 et 2 sont chacune notées sur 10 points.
  • Répondre correctement à la question 1 (respectivement aux questions 2.1 et 2.2) rapporte 5 points (à moduler selon la qualité de la réponse).
  • La réponse aux "questions à poser pendant l'oral" rapporte les 5 autres points.
---endCorr

Préparation

cd votreRepertoireDeTravailPourCSC4508M2
cp ~simatic/Cours/CSC4508/tPNote2008Session2.tgz .
tar xvfz tPNote2008Session2.tgz
cd TPNote2008Session2

Question 1 : Descendance

Le programme Q1/descendance.c prend en argument un entier qui est stocké dans la variable nbGenerations.
Modifiez ce programme pour que ce programme forke un enfant qui, lui-même forke un enfant qui, lui-même, forke un enfant... et ce nbGenerations fois. Voici un exemple de sortie que doit faire votre programme :
$ ./descendance 3
Generation 1 : enfant de pid 5562 ayant pour parent le processus de pid 5561
Generation 2 : enfant de pid 5563 ayant pour parent le processus de pid 5562
Generation 3 : enfant de pid 5564 ayant pour parent le processus de pid 5563

---beginCorr
voir descendance.corrige.c

Questions à poser pendant l'oral :
  • Comment garantissez-vous qu'il n'y a pas de zombies ?
  • Passez l'outil valgrind sur votre application. Pourquoi n'y a-t-il aucun message d'erreur ?
  • Passez l'outil splint sur votre application. Expliquez les éventuels messages d'erreur.
  • Comment auriez-vous fait si la variable s'était appelée nbEnfants et que donc, le programme avait dû créer nbEnfants enfants, tous enfants du même parent ?
---endCorr

Question 2 : Un tramway (nommé désir ?), le retour en conditionnel

On imagine que le futur tramway qui reliera Évry à Corbeil aura une section de voie unique (nommée SVU dans la suite) sur 2 kilomètres au niveau de TELECOM & Management SudParis.
De ce fait, une société est en charge d'écrire un simulateur de circulation sur les différentes voies. Elle fait appel à vos services pour la conception de la fonction circulationECSurSVU (respectivement circulationCESurSVU) qui gère l'accès à la SVU pour les tramway venant d'Évry (respectivement Corbeil), l'utilisation de cette voie et la sortie de la SVU.
Pour les questions suivantes (qui sont autant d'hypothèses d'utilisation de la SVU), vous devrez donc écrire les algorithmes (pas de code !) des fonctions circulationECSurSVU  et circulationCESurSVU en utilisant les opérations pthread_mutex_lock et pthread_mutex_unlock d'objets mutex thread.

Question 2.1 : Un seul train sur la SVU

Dans cette question, on souhaite qu'à tout instant, il ne puisse y avoir au maximum qu'un tramway sur la SVU.
Écrire les algorithmes (et éventuelles initialisations).
---beginCorr
C'est un problème d'exclusion mutuelle. On applique donc la solution de ce paradigme.

/* Initialisations */
mutex mutexSVU;

/* circulationECSurSVU  */
pthread_mutex_lock(mutexSVU)
  utilisationSVU()
pthread_mutex_lock(mutexSVU)

/* circulationCESurSVU  */
L'algorithme d'un tramway Corbeil-Evry est identique.
---endCorr

Question 2.2 : Plusieurs trains dans le sens EC sur la SVU

Dans cette question, on souhaite que plusieurs tramways EC puisse circuler simultanément sur la SVU. En revanche, à tout instant, au plus un tramway CE peut circuler sur la SVU. De plus, on ne peut jamais avoir un tramway EC et un tramway CE simultanément sur la SVU.
NB : On veillera à ce qu'il n'y ait jamais de tramway qui attende indéfiniment parce qu'il y a des tramways qui s'engagent constamment sur la SVU, mais dans l'autre sens.
Écrire les algorithmes (et éventuelles initialisations).
---beginCorr
C'est un problème de lecteurs (les tramway EC)/rédacteurs (les tramway CE) pour lequel il faut éviter les famines. On applique donc la solution de ce paradigme.

/* Initialisations */
mutex mutexSVU;
mutex mutexEC;
mutex mutexfifo;

int nbEC = 0

/* circulationECSurSVU  */
pthread_mutex_lock(fifo)
pthread_mutex_lock(mutexEC)
nbEC += 1
si nbEC == 1 alors
   pthread_mutex_lock(mutexSVU)
finsi
pthread_mutex_unlock(mutexEC)
pthread_mutex_unlock(fifo)
utilisationSVU()
pthread_mutex_lock(mutexEC)
nbEC -= 1
si nbEC == 0 alors
   pthread_mutex_unlock(mutexSVU)
finsi
pthread_mutex_unlock(mutexEC)

/* circulationCESurSVU  */
pthread_mutex_lock(fifo)
pthread_mutex_lock(mutexSVU)
pthread_mutex_unlock(fifo)
utilisationSVU()
pthread_mutex_unlock(mutexEC)

Questions à poser pendant l'oral :
  • Dans cette question, on souhaite que plusieurs tramways EC (respectivement CE) puisse circuler simultanément sur la SVU. En revanche, on ne peut jamais avoir un tramway EC et un tramway CE simultanément sur la SVU.
    NB : On veillera à ce qu'il n'y ait jamais de tramway qui attende indéfiniment parce qu'il y a des tramways qui s'engagent constamment sur la SVU, mais dans l'autre sens.
    Écrire ces algorithmes (et initialisations) sur le tableau.
---endCorr



Page mise à jour le 19 juin 2008