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


    Contenu



Gestion des processus

Corrigés

Exercice 1 : Parallélisme calcul et E/S

NB : Cet exercice est issu de http://deptinfo.cnam.fr/Enseignement/CycleProbatoire/SRI/Systemes/polyEDSIB.pdf . Avec l'aimable autorisation de Catherine COQUERY (CNAM, Département d'Informatique), il a été adapté par Michel SIMATIC au contexte de l'INT.

La commande time permet de connaître le temps d'exécution d'un programme. Exemple :
    $ /usr/bin/time calcul           
    5.96user 0.00system 0:06.35elapsed 93%CPU (0avgtext+0avgdata 0maxresident)k
    0inputs+0outputs (86major+8minor)pagefaults 0swaps
Noter qu'on tape "/usr/bin/time" et non "time" de manière à éviter d'invoquer la commande "time" intégrée au shell. En effet, celle-ci donne la sortie suivante :
    $ time calcul
        6.51s real     5.99s user     0.00s system

La version de time (/usr/bin/time) utilisée ici affiche dans l'ordre les résultats suivants :
  • U: (user) temps CPU pour le processus
  • S: (system) temps CPU que le noyau a consacré au processus
  • E: (elapsed) temps total d'exécution du processus
  • P: rapport (U+S)/E en pourcentage
  • X+D: mémoire partagée (X) ou non (D) utilisée en moyenne par le processus (en Ko)
  • R: Taille résidente maximale
  • I+O: nombre de lectures (I) et d'écritures (0) de blocs sur le disque
  • pF: nombre de défauts de page se divisant en (Cf. Exercice 1 du TP "Gestion de la mémoire") :
    • m: mineur (la page est en RAM, mais elle n'est pas dans un cadre de page)
    • M: Majeur (la page n'est pas en RAM, il faut aller la chercher sur disque)
  • sw: Nombre de swaps
NB :
  • La plupart de ces informations sont issues d'appels à la fonction getrusage (Cf. Exercice 1 du TP "Gestion de la mémoire")
  • Sous Linux, seuls U, S, E, P et pF sont renseignés (Cf. "man getrusage")

Préparation

Pour cet exercice, vous avez besoin que tous les processus soient exécutés sur le même coeur de processeur. Sur une machine multi-coeur, vous avez deux solutions : soit vous utilisez la commande taskset (qui permet d'imposer le coeur sur lequel on souhaite exécuter un processus), soit vous utilisez une machine virtuelle qui vous offre la garantie que nous utiliserons un noyau qui n'est pas SMP (Symmetric MultiProcessing). Voyez avec l'enseignant-chercheur qui anime ce Cours Intégré la solution qu'il préfère.

S'il vous demande d'utiliser la commande taskset, passez directement au paragraphe " Se placer dans un répertoire de travail" ci-dessous.

S'il vous demande d'utiliser la solution à base de machine virtuelle, vous allez réutiliser un disque dur de machine virtuelle Xubuntu :
  1. cp      ~simatic/.VirtualBox/HardDisks/Xubuntu.vdi       /var/tmp
    (NB : La copie prend plusieurs minutes, puisque ce fichier fait 5,3 Go)
  2. Lancer Oracle VirtualBox via l'interface graphique
  3. Dans VirtualBox, cliquer sur Nouveau
  4. Mettre
    1. Nom : Xubuntu
    2. Système d'exploitation : Linux
    3. Version : Ubuntu (64 bit)
  5. Cliquer sur Suivant
  6. Mettre 1024 Mo pour la mémoire de base
  7. Cliquer sur Suivant
  8. Disque dur d'amorçage doit être coché. Sélectionner "Utiliser disque dur existant", puis cliquer sur l'icône de sélection de dossier, puis cliquer sur "Ajouter"et enfin sélectionner /var/tmp/Xubuntu.vdi (i.e. le fichier que vous avez recopié).
  9. Cliquer sur Suivant
  10. Cliquer sur "Terminer" : La machine virtuelle "Xubuntu" est créée.
  11. Double-cliquer sur la machine virtuelle "Xubuntu" : elle démarre.
    Dans la suite, nous appellerons machine hôte (host machine) la machine sur laquelle vous avez lancé VirtualBox et machine invitée (guest machine) la machine virtuelle Xubuntu.
  12. Se connecter à la machine invitée en tant que "csc4508", mot de passe "csc4508" (Ce compte est "sudoer").
  13. Les étapes suivantes sont destinées à vous permettre d'accéder au répertoire de votre compte Unix (fourni par la DISI) à partir de la machine invitée :
    1. Dans la fenêtre VirtualBox (qui héberge la machine invitée), menu Périphériques / Dossiers partagés
    2. Cliquer sur le "+"
      1. Chemin du répertoire : Chemin vers votre répertoire DISI
      2. Nom du répertoire : [votreNomDeUserUnix]
      3. Cocher "Montage automatique" et "Configuration permanente"
      4. Redémarrer la machine invitée.
    3. La machine invitée peut désormais accéder (en lecture/écriture) à votre répertoire DISI en accédant à /media/sf_votreNomDeUserUnix
  14. NB : ne travaillez que dans votre répertoire DISI ! En effet, si vous stockez des choses sur le disque de votre machine invitée, dès que vous effacerez le fichier /var/tmp/Xubuntu.vdi, le contenu du disque de votre machine invitée sera perdu !
Se placer dans un répertoire de travail
tar xvfz cmpCpuES.tgz
cd CmpCpuES
make

Question 1

Lancer le programme  calcul pour vérifier que vous n'avez pas besoin de taper ./calcul dans les commandes suivantes (Dit autrement, le répertoire courant (.) est dans votre PATH). Si le lancement de calcul donne lieu à une erreur, modifier votre PATH en tapant la commande suivante : export PATH=.:$PATH
Lancer /usr/bin/time calcul
Modifier la constante NBFOIS dans calcul.c pour que le temps d'exécution soit d'environ 20 secondes.
NB : n'oubliez pas de recompiler calcul.c à chaque fois que vous modifiez NBFOIS.
Interpréter les résultats affichés par time. Répéter une ou deux fois l'opération. Que constate-t'on ?

Question 2

Lancer /usr/bin/time disque
Adapter la constante NBFOIS dans le fichier disque.c pour que la commande /usr/bin/time disque affiche un temps total d'exécution égal (à +/- 10%) du temps total d'exécution de /usr/bin/time calcul
Calculer le temps passé en E/S

Question 3

Si vous êtes sur machine virtuelle, lancer (calcul&);/usr/bin/time calcul
Sinon lancer (taskset -c 0 calcul&);/usr/bin/time taskset -c 0 calcul
NB : dans la commande précédente, le "&" indique que le processus doit être lancé en tâche de fond. Ainsi, on a deux processus calcul qui s'exécutent en parallèle.
Interpréter les résultats.

Question 4

Si vous êtes sur machine virtuelle :
  • Lancer (/usr/bin/time calcul&);disque &
  • Lancer (calcul&);/usr/bin/time disque &
Sinon
  • Lancer (/usr/bin/time taskset - c 0 calcul&);taskset -c 0 disque &
  • Lancer (taskset -c 0 calcul&);/usr/bin/time taskset -c 0 disque &

Interpréter les résultats

Question 5

Si vous êtes sur machine virtuelle, reprendre toutes les questions précédentes hors de la machine virtuelle (donc sur un noyau SMP).
Sinon, lancez les commandes précédentes sans utiliser la commande taskset.

Observez les différences de performances.

Rangement

Si vous n'avez plus besoin d'utiliser votre machine invitée (NB : l'exercice suivant en a besoin), arrêtez-là. Puis supprimez le fichier /var/tmp/Xubuntu.vdi (une manière plus propre de faire est de supprimer la machine virtuelle de VirtualBox et surtout son disque associé !).

Exercice 2 : A propos des priorités

Préparation

Si vous pouvez vous connecter à une machine sur laquelle vous avez les droits root ou bien vous êtes "sudoer" et si vous avez déjà manipulé des machines virtuelles, réalisez cet exercice sur cette machine.
Sinon réalisez cet exercice sur une machine Linux virtuelle (sur laquelle vous serez "sudoer"). Pour ce faire, reportez-vous à la section Préparation de l'Exercice 1

Se placer dans un répertoire de travail
tar xvfz rtSleep.tgz
cd RtSleep
make

Question 1

Dans une fenêtre "utilisateur standard", taper
  • sleep 1000 &
  • nice sleep 1000 &
  • nice -n 19 sleep 1000 &
  • ps -al
Observer les colonnes PRI et NI. À quelles priorités correspondent-elles ?
Taper
  • nice -n -1 sleep 1000
Pourquoi avez-vous un message d'erreur ?
Taper
  • sudo nice -n -1 sleep 1000

Question 2

Taper :
  • sudo nice -n -1 sleep 1000 &
    (et fournir le mot de passe pour pouvoir effectuer sudo)
  • sudo nice -n -20 sleep 1000 &
    (et fournir le mot de passe pour pouvoir effectuer sudo)
  • ps -al
Observer les colonnes PRI et NI.

Question 3

Taper :
  • aller dans le répertoire RtSleep
  • sudo nice -n 19 ./rtSleep 99 1000 &
  • ps -al
Commenter l'affichage de rtSleep et de ps

Question 4

Allez dans le répertoire CmpCpuES de l'exercice 1.
Lancez la commande : (/usr/bin/time calcul &) ; nice -n 10 /usr/bin/time calcul
Observez la différence de temps d'exécution entre les deux processus.

Question 5

Lancez la commande : cp calcul.c calculPrioStat.c
En vous inspirant du contenu du fichier rtSleep.c, modifiez calculPrioStat.c pour qu'il puisse s'exécuter en priorité statique 1.
Lancez la commande : (/usr/bin/time calculPrioStat &) ; /usr/bin/time calcul
Observez la différence de temps d'exécution entre les deux processus.

Rangement

Si vous n'avez plus besoin d'utiliser votre machine invitée (NB : l'exercice suivant en a besoin), arrêtez-là. Puis supprimez le fichier /var/tmp/Xubuntu.vdi (une manière plus propre de faire est de supprimer la machine virtuelle de VirtualBox et surtout son disque associé !).

Exercice 3 : De l'ordonnancement temps-réel

Préparation

Si vous pouvez vous connecter à une machine sur laquelle vous avez les droits root ou bien vous êtes "sudoer" et si vous avez déjà manipulé des machines virtuelles, réalisez cet exercice sur cette machine.
Sinon réalisez cet exercice sur une machine Linux virtuelle (sur laquelle vous serez "sudoer"). Pour ce faire, reportez-vous à la section Préparation de l'Exercice 1.

Se placer dans un répertoire de travail
tar xvfz polOrdo.tgz
cd PolOrdo

Question 1

Ouvrir le fichier polOrdo.c
Adaptez la valeur de la constante NBFOIS en fonction de l'environnement dans lequel vous vous exécutez (machine virtuelle ou bien machine native).
Chercher les différents points d'interrogation (?) correspondant aux instructions (ou texte quand ces points d'interrogation apparaissent à l'intérieur d'une chaîne de caractères) à ajouter. Y répondre.
Taper "make" pour compiler polOrdo.c

Question 2

Si vous avez le droit de passer "root", exécuter "polOrdo" (NB : si vous êtes sur une machine invitée, les performances sont évidemment moins bonnes que si vous étiez sur une machine hôte).
Sinon utiliser les résultats ci-dessous obtenus sur une machine équipé d'un Pentium à 900 Mhz munie de 512 Mo de RAM et 900 Mo de swap. La machine tournait sous RedHat 7.3 (Linux 2.4.20-18.7 (résultat de la commande uname -sr)) :
Temps mesure 1 =         0.568704 s
Temps mesure 2 =         0.907726 s
Temps mesure 3 =         0.000173 s
Temps mesure 4 =         2.708345 s
Temps mesure 5 =         0.052389 s
Temps mesure 6 =         1.009992 s
Temps CPU intensif =        2.843138 s
Valeur de ts (pour le fils) =        0.060000000 s (attention Nanosecondes !)

Interpréter les résultats obtenus

Rangement

Si vous n'avez plus besoin d'utiliser votre machine invitée, arrêtez-là. Puis supprimez le fichier /var/tmp/Xubuntu.vdi (une manière plus propre de faire est de supprimer la machine virtuelle de VirtualBox et surtout son disque associé !).



Page mise à jour le 20 avril 2017