CSC 3102 – Introduction aux systèmes d’exploitation

Portail informatique

CSC3102 – Contrôle Final 1 – Année 2019/2020

Consignes :
  • Répondez aux questions en écrivant directement dans les cadres fournis au fil du sujet ou dans les listings des scripts placés en fin d'exercice. Si vous deviez manquer de place, vous pouvez également écrire en fin de sujet en l'indiquant dans l'encart initial.
  • Sont autorisés le polycopié, l'annexe et les travaux pratiques du module, ainsi que vos notes personnelles manuscrites.
  • Les trois exercices sont indépendants.
  • La durée est fixée à 2h.
  • Le barème est donné à titre indicatif.

Le tri de fichiers par taille (6 points)

Le but de cet exercice est d'extraire un ensemble de fichiers selon un motif, de récupérer leur taille dans un fichier et de trier ce fichier selon l'ordre croissant des tailles. Soit un répertoire contenant un ensemble de fichiers (pas de répertoires).

Pour commencer, donnez la commande qui permet de sélectionner dans le répertoire courant , les fichiers dont le nom :
  • commence par toto,
  • suivi d'un chiffre entre 3 et 6,
  • suivi d'un tiret,
  • suivi d'une lettre quelconque,
  • suivi d'une chaîne de caractères de longueur quelconque.
  • Consigne : Pour cette question, il est strictement interdit d'utiliser la commande find .
    ls toto[3-6]-[[:alpha:]]*

    Pour chaque fichier sélectionné à la question 1, récupérez sa taille et sauvegardez-la dans un fichier nommé taille_fichiers.txt, supposé vide ou inexistant. Notez que le fichier taille_fichiers.txt doit contenir la taille de l'ensemble des fichiers sélectionnés à la question 1 et uniquement leur taille.
    Consigne : Pour rappel, la commande du -d0 exam.pdf donne la taille du fichier exam.pdf. La sotie de la commande est comme suite :
    $ du -d0 exam.pdf 192 exam.pdf $
    #!/bin/bash rm taille_fichiers.txt 2> /dev/null for fic in toto[3-6]-[[:alpha:]]*; do du -d0 $fic | cut -f 1 >> taille_fichiers.txt done
  • Pour cette question, les points ne concernent que la boucle for (la suppression du fichier n'est pas comptée).
  • la commande wc -c pour récupérer la taille du fichier est également acceptée.
  • Pour finir, donnez la commande permettant de trier le fichier taille_fichiers.txt selon l'ordre croissant des tailles
    sort -n taille_fichiers.txt

    Interlude publicitaie (8 points)

    Afin de financer la diffusion en boucle du Boléro de Ravel, un processus cantateur bolero fait appel à un service publicitaire. Ce dernier est chargé de fournir au cantateur des réclames de longueurs variées à une fréquence aléatoire.

    Le script bolero.sh est démarré en tâche de fond avant le script publicitaire.sh, qui prend en paramètre le PID du processus cantateur. L'illustration suivante propose un scénario d'exécution conforme au comportement attendu une fois l'exercice achevé :

    $ ./bolero.sh & Bolero [PID=1298] Quem tem a viola Pra se acompanhar Nao vive sozinho Nem pode penar Tem som de rio .... *******[PUB]********** Le shell, c'est la vie ! ********************** .....
    $ ./publicitaire.sh 1298

    Présicion : Dans cet exercice, il n'y a pas de concurrence : on considère qu'il n'y a qu'un seul processus bolero et qu'un seul processus publicitaire.

    Consignes : Les squelettes des différents scripts sont donnés en fin d'exercice. Ils doivent être complétés au fur et à mesure que vous répondez aux questions de cet exercice. Merci d'annoter chaque ligne ajoutée avec le numéro de la question à laquelle vous répondez. De plus, l'espace mis à disposition n'invite pas forcément à remplissage.

    Une réclame correspondant à une série de lignes textuelles, mettez en place un canal de communication entre les processus bolero et publicitaire permettant de transmettre de telles données. Après avoir créé le canal, n'oubliez pas de le maitenir ouvert en mettant en place des redirections avancées grâce à la commande exec.

    À chaque fois que le publicitaire le notifie, le cantateur bolero doit stopper la diffusion de son opéra, diffuser la publicité qui lui est transmise via le canal de communication ouvert à la question précédente puis reprendre la diffusion du Boléro où il l'avait laissée.

    1. Mettez en place la notification du processus bolero par le publicitaire en lui envoyant un signal de type USR1.
    2. Mettez en place la récupération de la notification émise à la question précédente dans le script bolero.sh. Elle doit avoir pour effet le lancement du script lecture_pub.sh. Ce dernier a pour objectif de récupérer et d'afficher la publicité transmise et sera l'objet de la question suivante.

    Une réclame est composée de plusieurs lignes qui doivent être lues et affichées les unes après les autres par lecture_pub.sh, sur demande du processus bolero.

    1. Afin de pouvoir identifier la fin de la réclame, finalisez la transmission de la réclame faite dans le script publicitaire.sh avec l'écriture de la ligne "FIN DE LA PUB".
    2. Complétez le script lecture_pub.sh qui est en charge de lire ligne-à-ligne sur le canal de communication dédié. Le script affiche au fur et à mesure ce qu'il lit tant que la ligne "FIN DE LA PUB" n'est pas lue.

    Le problème des trains de Whittier (6 points)

    Whittier est une ville d'Alaska traversée par une voie de chemin de fer. Cette voie passe dans un tunnel traversant la montagne. Cependant, les trains traversant la montagne dans les deux sens partagent la même voie. En d'autres termes, une unique voie est utilisée dans les deux sens.

    Afin d'éviter les soucis de collision, un feu de signalisation est installé de chaque côté de tunnel.

    Les codes exécutés par les trains allant de l'est à l'ouest (trainEO.sh), allant de l'ouest à l'est (trainOE.sh), pour gérer les feux de signalisation (feu.sh) ainsi que les explications des différents scripts sont fournis ci-dessous.

    Afin que les trains puissent voir la couleur du feu, celle-ci est écrite dans un fichier pour chaque sens. Ainsi, lorsque le feu Est-Ouest est vert, feu.sh écrit la valeur 1 dans le fichier feuEO et la valeur 0 dans feuOE (indiquant que le feu Ouest-Est est rouge). À chaque itération, le processus exécutant feu.sh fait passer le feu rouge à vert (de la valeur 0 à la valeur 1) et le feu vert à rouge (de 1 à 0).

    Du côté des trains, un train voulant passer de l'Est à l'Ouest lit la valeur contenue dans le fichier feuEO. Tant que cette valeur n'est pas égale à 1 (donc n'est pas passée au vert), le processus continue de lire la valeur. Une fois la valeur à 1, le train passe en affichant "le train Est-Ouest passe". Un train voulant faire le trajet Ouest-Est exécute un code similaire avec le fichier feuOE. On considère qu'un train est passé lorsque le script correspondant affiche le message et se termine.

    Soit le script regulation.sh suivant:

    Ce script initialise les feux (le feux Est-Ouest est vert et le feu Ouest-Est est rouge), puis démarre les différents scripts en arrière plan.

    Après le démarrage de regulation.sh, proposez un scénario d'exécution dans lequel deux trains circulant en sens opposés passent tous les deux sur la voie (donc avec une collision).
    Juste après l'initialisation par regulation.sh, le processus trainEO.sh lit la valeur de feuEO qui vaut 1 et ne rentre pas dans le while. À cet instant, il y a une commutation de contexte et le processus feu.sh est exécuté, il met la valeur 1 dans feuOE. À cet instant, il y a une nouvelle commutation de contexte et le processus trainOE est démarré. Il teste la valeur dans feuOE qui vaut 1, et il passe aussi.

    Identifiez et protégez la section critique dans les codes des différents processus à l'aide de mutex afin de garantir qu'un seul train passe à la fois. Notez qu'un unique mutex, appelé passage.lock, suffit à résoudre le problème.
    Consigne : Pour répondre à la question, il suffit de compléter les scripts fournis avec le sujet à la page suivante.