L’objectif de ce TP est de (re)découvrir les commandes de base des systèmes d’exploitation Unix et de découvrir comment sont gérés les processus.
Les questions identifiées par le symbole
demande une réponse à écrire sur votre feuille.
ps
La commande ps
permet de lister les processus actifs. Vous pouvez retrouver la documentation minimale dans le cours. Pour plus de détails, utiliser la commande man ps.
Question 1 - Ouvrir un terminal et essayer la commande ps
.
Question 2 - Donner le PID du terminal en cours.
Question 3 - Donner le PID de la commande
ps
.
Question 4 - Essayer la commande ps -ef
.
Question 5 - Donner le PID et le PPID du processus
init
.
Question 6 - Donner le PID de 5 processus fils de
init
.
Question 7 - Donner le PID de la commande
ps -ef
.
top
La commande ps ne permet pas de suivre en temps réel les processus (affichage figé). Pour avoir un suivi en temps réel, vous pouvez utiliser la commande top.
Question 1 - Donner le nombre total de processus en cours.
Question 2 - Donner le PID du processus le plus gourmand.
Question 3 - Donner les PID des processus suivants :
cron
apache2
sshd
python3
Question 4 - Avec l'aide de la commande top, tuer le processus top
. Indiquer ce qu'il s'est passé.
kill
.Question 1 - Ouvrir une fenêtre firefox
.
Question 2 - À l'aide de la commande kill
, tuer le processus firefox
à l'aide de son PID.
Maintenant, si un de vos programmes crash, vous savez vous débrouiller pour tuer son processus.
bg
Question 1 - Lancer la commande xeyes
. Si la commande n'est pas installée, utiliser apt-get install x11-apps.
Des yeux s’affichent et suivent votre souris. La chose importante se trouve au niveau du terminal.
Cette commande est lancée en avant-plan, c’est-à-dire qu’elle rendra la main au terminal à la fin du processus xeyes
.
Question 2 - Dans un second terminal, tuer le processus xyes
du premier terminal.
Question 3 - Avec la commande bg
, lancer xeyes
en arrière. Pour cela, il faut effectuer les manipulations suivantes :
bg
Le processus s’exécute maintenant en arrière-plan.
Question 4 - Utiliser une seconde méthode pour lancer la commande xeyes
en arrière-plan.
Question 5 - Tuer les 2 processus xeyes
.
Sous Linux, on peut passer des consignes à l'ordonnanceur en fixant des priorités aux processus dont on est propriétaire : cette priorité est un nombre entre -20 (plus prioritaire) et +20 (moins prioritaire)
Les utilisateurs autres que le super-utilisateur root ne peuvent que diminuer la priorité de leurs processus. Et encore, ils sont restreints à la plage de 0 à 19.
Seul
root
peut jouer sur l’intégralité de l’échelle, pour n’importe quel processus actif.
Il est possible d'agir à 2 niveaux concernant la priorité d'un processus :
nice
.renice
Question 1 - Relancer la commande top
. Les colonnes PR et NI montrent le niveau de priorité de chaque processus.
Le lien entre PR et NI est simple : PR = NI + 20 ce qui fait qu'une priorité PR de 0 équivaut à un niveau de priorité maximal.
Question 2 - Lancer un processus de xeyes
.
Question 3 - À l'aide de la commande top
, trouver la priorité du processus.
Pour baisser la priorité d'un processus dont le PID est 21523, il suffit d'exécuter la commande suivante :
nsi@pc-nsi:~$ renice +10 21523
Nous allons tester l'efficacité du paramètre nice
de l'ordonnanceur sur le temps d'exécution d'un programme python. Pour cela, nous allons charger le processeur de la machine au maximum et chronométrer le temps d'exécution d'un script python pour plusieurs valeurs du paramètre nice
.
Pour cet exercice, n'hésitez pas à ouvrir plusieurs fenêtres de terminal côte à côte.
Question 1 - En utilisant la commande cat /proc/cpuinfo, trouver le nombre de processeurs disponibles sur votre machine.
Question 2 - Créer un fichier python nommé infini.py
contenant une boucle infinie.
Question 3 - Créer un second fichier nommé bidon.py
contenant le programme suivant :
def run():
a = 0
for i in range(100000):
a += a**3
Question 4 - Lancer un interpréteur python3
dans un terminal et noter son PID.
Question 5 - Dans l'interpréteur, écrire les commandes suivantes :
>>> from timeit import timeit
>>> import bidon
>>> timeit(bidon.run, number = 100)
Cette commande va lancer 100 fois la fonction
bidon
et renvoyer le temps d'exécution moyen.
Question 6 - Exécuter la commande python3 infini.py &
autant de fois qu'il y a de processeurs sur la machine. Le symbole & permet de lancer le programme en arrière-plan.
Ici, nous allons monopoliser l'ensemble des ressources processeurs de la machine avec des boucles infinies. Le travail de l'ordonnanceur sera donc bien visible, car les ressources processeur vont se raréfier.
Question 7 - Relancer timeit(test.bidon, number = 100)
dans le shell python. Vous devriez noter un ralentissement du temps d'exécution par rapport à la première fois. En effet, le processeur a moins de temps à consacrer à l'exécution de la fonction bidon
, à cause de programme effectuant une boucle infinie.
Question 8 - Augmenter la priorité de l'interpréteur python à +10.
Question 9 - Relancer timeit(test.bidon, number = 100)
dans le shell python. Que constatez-vous ?
Question 1 - Dans Thonny, créez un fichier nommé testFork.py
avec le programme suivant :
# importing os module
import os, time
# Create a child process using os.fork() method
pid = os.fork()
# pid greater than 0 represents the parent process
if pid > 0 :
print("I am parent process:")
print("Process ID:", os.getpid())
print("Child's process ID:", pid)
# pid equal to 0 represents the created child process
else :
print("\nI am child process:")
print("Process ID:", os.getpid())
print("Parent's process ID:", os.getppid())
a = 0
for i in range(10000):
a += a**3
time.sleep(0.001)
print("Finished")
# If any error occurred while using os.fork() method OSError will be raised
Question 2 - Exécutez ce fichier par la commande python3 testFork.py
. Observez dans ce terminal l'effet du script.
Question 3 - Dans un autre terminal, observez les PID et PPID des processus créés à l'aide de la commande ps -ef
.
Question 4 - Tuer le processus enfant (Si nécessaire, relancez le script). Que se passe-t-il ?
Question 5 - Tuer le processus parent et attendez quelques secondes (Si nécessaire, relancez le script). Que se passe-t-il ?
Parfois un processus père est tué avant que ses processus fils soient terminés. Ceux-ci restent alors dans la table des processus en situation finale, mais ne sont pas supprimés.
On parle alors de processus zombies. Ceux-ci occupent une partie de la mémoire, tout en étant devenus inutiles...