Multiprocessing et Ordonnanceur
Processus, signaux et communication
Exercice #1: Concevez et développez une petite application mettant en
œuvre un des services de communication proposés par Linux (par exemple
socketpair
) entre un processus parent et un processus enfant. Le
processus enfant devra émettre quelques messages sous forme de texte
vers le processus parent, lequel les affichera sur la console. Le
message exit
permettra de terminer l’application. Cette application
devra impérativement capturer les signaux
SIGHUP
,
SIGINT
,
SIGQUIT
,
SIGABRT
et
SIGTERM
et les ignorer. Seul un message d’information sera affiché sur la
console. Chacun des processus devra utiliser son propre cœur, par
exemple core 0 pour le parent, et core 1 pour l’enfant.
CGroups
Exercice #2: Concevez une petite application permettant de valider la capacité des groupes de contrôle à limiter l’utilisation de la mémoire.
Quelques indications pour la création du programme :
- Allouer un nombre défini de blocs de mémoire d’un mébibyte1, par exemple 50
- Tester si le pointeur est non nul
- Remplir le bloc avec des 0
Quelques indications pour monter les CGroups :
$ mount -t tmpfs none /sys/fs/cgroup
$ mkdir /sys/fs/cgroup/memory
$ mount -t cgroup -o memory memory /sys/fs/cgroup/memory
$ mkdir /sys/fs/cgroup/memory/mem
$ echo $$ > /sys/fs/cgroup/memory/mem/tasks
$ echo 20M > /sys/fs/cgroup/memory/mem/memory.limit_in_bytes
Quelques questions :
- Quel effet a la commande
echo $$ > ...
sur les cgroups ? - Quel est le comportement du sous-système memory lorsque le quota de mémoire est épuisé ? Pourrait-on le modifier ? Si oui, comment ?
- Est-il possible de surveiller/vérifier l’état actuel de la mémoire ? Si oui, comment ?
Exercice #3: Afin de valider la capacité des groupes de contrôle de limiter l’utilisation des CPU, concevez une petite application composée au minimum de 2 processus utilisant le 100% des ressources du processeur.
Quelques indications pour monter les CGroups :
- Si ce n’est pas déjà effectué, monter le cgroup de l’exercice précédent.
$ mkdir /sys/fs/cgroup/cpuset
$ mount -t cgroup -o cpu,cpuset cpuset /sys/fs/cgroup/cpuset
$ mkdir /sys/fs/cgroup/cpuset/high
$ mkdir /sys/fs/cgroup/cpuset/low
$ echo 3 > /sys/fs/cgroup/cpuset/high/cpuset.cpus
$ echo 0 > /sys/fs/cgroup/cpuset/high/cpuset.mems
$ echo 2 > /sys/fs/cgroup/cpuset/low/cpuset.cpus
$ echo 0 > /sys/fs/cgroup/cpuset/low/cpuset.mems
Quelques questions :
- Les 4 dernières lignes sont obligatoires pour que les prochaines commandes fonctionnent correctement. Pouvez-vous en donner la raison ?
- Ouvrez deux shells distincts et placez une dans le cgroup high et
l’autre dans le cgroup low, par exemple :
Lancez ensuite votre application dans chacun des shells. Quel devrait être le bon comportement ? Pouvez-vous le vérifier ?
# ssh root@192.168.0.14 $ echo $$ > /sys/fs/cgroup/cpuset/low/tasks
- Sachant que l’attribut
cpu.shares
permet de répartir le temps CPU entre différents cgroups, comment devrait-on procéder pour lancer deux tâches distinctes sur le cœur 4 de notre processeur et attribuer 75% du temps CPU à la première tâche et 25% à la deuxième ?
Archives 2021/2022
-
\(1\) mébibyte = \(2^{20}\) byte ↩