6.5 KiB
Interruptions - Ordonnancement
- partie 1 : interruptions
- partie 2 : Ordonnamcement
Ex1 1
Ouvrez un terminal et exécutez :
ps
Puis :
ps -f
et :
ps -eo pid,ppid,stat,ni,pri,psr,comm
Cette dernière commande affiche notamment :
PID: identifiant du processus ;PPID: identifiant du processus père ;STAT: état du processus ;NI: valeur de nice ;PRI: priorité affichée par Linux ;PSR: numéro du processeur sur lequel le processus s'est exécuté ;COMMAND: nom du programme.
Questions
- Quelle est la valeur de
niced'un processus nouvellement créé ? - Quelles valeurs peut prendre
nice? - Que signifie une valeur de
niceélevée ? - Que signifie l'état
R? - Que signifie l'état
S? - Pourquoi le champ
PSRpeut-il changer au cours du temps ?
Ex2.
Nous allons créer un programme très simple qui consomme du temps processeur.
Créez le fichier cpu.c :
#include <stdio.h>
int main(void)
{
unsigned long long i = 0;
while (1)
i++;
return 0;
}
Compilez-le :
gcc -O2 -o cpu cpu.c
Lancez-le :
./cpu
Dans un autre terminal :
top
Questions
- Quel pourcentage de CPU utilise le processus
cpu? - Observez le champ
NI. - Observez le champ
PR. - Sur quel processeur le processus s'exécute-t-il ?
Utilisez :
watch -n 0.1 ps -C cpu -o pid,ni,pri,psr,comm
- Appuyez sur
1danstop. Que constatez-vous concernant les différents processeurs ?
Pour arrêter le programme :
killall cpu
Ex3
Lancez maintenant deux instances :
./cpu &
./cpu &
Puis :
watch -n 0.1 ps -C cpu -o pid,ni,pri,psr,pcpu,comm
et observez avec :
top
Questions
- Si votre machine possède plusieurs processeurs logiques, les deux processus utilisent-ils nécessairement le même processeur ?
- Lancez quatre processus :
./cpu &
./cpu &
./cpu &
./cpu &
Observez leur utilisation CPU.
- Que se passe-t-il si vous lancez davantage de processus que votre machine ne possède de processeurs logiques ?
- Pourquoi un processus CPU-bound finit-il malgré tout par laisser le processeur à un autre processus ?
Ex4
La commande nice permet de lancer un processus avec une valeur de nice particulière.
Lancez :
nice -n 10 ./cpu &
Puis :
watch -n 0.1 ps -C cpu -o pid,ni,pri,pcpu,comm
Comparez avec un processus lancé normalement :
./cpu &
Questions
- Quelle est la valeur de
nicedes deux processus ? - Leur valeur de
PRIest-elle identique ? - Que signifie concrètement
nice = 10? - Est-ce que
nicesignifie que le processus est exécuté « moins souvent » au sens strict ?
Ex5
Lancez deux processus :
./cpu &
./cpu &
Repérez leurs PID :
pgrep cpu
Choisissez l'un des deux PID et modifiez sa valeur de nice :
renice 10 -p PID
par exemple :
renice 10 -p 12345
Observez :
ps -p 12345 -o pid,ni,pri,pcpu,comm
Expérience
Essayez de faire tourner simultanément deux processus cpu :
- l'un avec
nice = 0; - l'autre avec
nice = 10.
Observez leur consommation CPU pendant plusieurs secondes.
Questions
- Le processus avec
nice = 10reçoit-il toujours du CPU ? - Que constatez-vous lorsque les deux processus se disputent le même processeur ?
- Si les deux processus peuvent s'exécuter simultanément sur deux processeurs différents, l'effet de
niceest-il aussi visible ? - Expliquez pourquoi.
Attention :
nicemodifie la priorité relative d'un processus, mais ne lui réserve pas une quantité fixe du processeur.
Ex6
Linux permet de restreindre les processeurs sur lesquels un processus peut s'exécuter.
Utilisez :
nproc
pour connaître le nombre de processeurs logiques disponibles.
Lancez :
taskset -c 0 ./cpu &
Puis :
ps -C cpu -o pid,psr,pcpu,comm
Vous pouvez également consulter directement l'affinité :
taskset -p PID
Questions
- Sur quel processeur le processus est-il autorisé à s'exécuter ?
- Pourquoi le champ
PSRreste-t-il normalement égal à0? - Quelle différence faites-vous entre :
nice
et :
taskset
Ex7
Nous allons maintenant forcer deux processus à utiliser le même processeur.
Lancez :
taskset -c 0 ./cpu &
taskset -c 0 ./cpu &
Observez :
top
Puis :
ps -C cpu -o pid,ni,pri,psr,pcpu,comm
Questions
- Les deux processus peuvent-ils s'exécuter simultanément sur le CPU 0 ?
- Quelle proportion approximative du temps processeur reçoit chaque processus ?
Modifiez maintenant la priorité du premier processus :
renice 10 -p PID1
et laissez le second avec :
nice = 0
- Observez à nouveau
top. - Expliquez qualitativement l'effet de
nicelorsque deux processus CPU-bound sont contraints de partager le même processeur.
Ex8
Linux fournit de nombreuses informations sur chaque processus dans :
/proc/PID/
Pour un processus cpu, examinez :
cat /proc/PID/status
puis :
cat /proc/PID/sched
Dans sched, recherchez notamment :
se.sum_exec_runtime
nr_switches
nr_voluntary_switches
nr_involuntary_switches
Questions
- Que représente
se.sum_exec_runtime? - Quelle différence faites-vous entre :
- changement de contexte volontaire ;
- changement de contexte involontaire ?
- Pourquoi un processus
cpudevrait-il avoir relativement peu de changements de contexte volontaires ?
Ex9
Nous allons mettre en place l'expérience suivante :
- deux processus
cpu; - tous deux limités au CPU 0 ;
- processus A :
nice = 0; - processus B :
nice = 15.
Lancez-les :
taskset -c 0 ./cpu &
et :
taskset -c 0 nice -n 15 ./cpu &
Notez leurs PID.
Après environ 30 secondes, récupérez :
cat /proc/PID_A/sched
cat /proc/PID_B/sched
Relevez notamment :
se.sum_exec_runtime
nr_switches
Questions
- Le temps CPU obtenu par A et B est-il identique ?
- Comparez les valeurs de
se.sum_exec_runtime. - Quelle conclusion pouvez-vous tirer sur l'influence de
nice? - Pourquoi cette expérience est-elle plus significative lorsque les deux processus sont attachés au même CPU ?