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


   Évaluation



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 »).
  1. Expliquez le problème que peuvent poser ces accès concurrents au tableau.
  2. 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.
  3. 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

  1. 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.
  2. 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);
    }
  3. 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


Page mise à jour le 14 juin 2012