J'ai toujours appris que le processus init est l'ancêtre de tous les processus. Pourquoi le processus 2 a-t-il un PPID de 0 ?
$ ps -ef | head -n 3
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 May14 ? 00:00:01 /sbin/init
root 2 0 0 May14 ? 00:00:00 [kthreadd]
Réponse acceptée :
Premièrement, "ancêtre" n'est pas la même chose que "parent". L'ancêtre peut être le parent du parent … le parent du parent, et le noyau ne garde la trace que d'un seul niveau.
Cependant, lorsqu'un processus meurt, ses enfants sont adoptés par init, vous verrez donc beaucoup de processus dont le parent est 1 sur un système typique.
Les systèmes Linux modernes ont en outre quelques processus qui exécutent le code du noyau, mais sont gérés comme des processus utilisateur, en ce qui concerne la planification. (Ils n'obéissent pas aux règles habituelles de gestion de la mémoire puisqu'ils exécutent le code du noyau.) Ces processus sont tous générés par kthreadd
(c'est l'init des threads du noyau). Vous pouvez les reconnaître par leur ID de processus parent (2) ou, généralement, par le fait que ps
les répertorie avec un nom entre crochets ou par le fait que /proc/2/exe
(normalement un lien symbolique vers l'exécutable du processus) ne peut pas être lu.
Processus 1 (init
) et 2 (kthreadd
) sont créés directement par le noyau au démarrage, ils n'ont donc pas de parent. La valeur 0 est utilisée dans leur champ ppid pour l'indiquer. Pensez à 0 comme signifiant "le noyau lui-même" ici.
Linux dispose également de certaines fonctionnalités permettant au noyau de démarrer des processus utilisateur dont l'emplacement est indiqué via un paramètre sysctl dans certaines circonstances. Par exemple, le noyau peut déclencher des événements de chargement de module (par exemple, lorsqu'un nouveau matériel est découvert ou lorsque certains protocoles réseau sont utilisés pour la première fois) en appelant le programme dans le kernel.modprobe
valeur sysctl. Lorsqu'un programme vide le noyau, le noyau appelle le programme indiqué par kernel.core_pattern
le cas échéant.