J'ai toujours appris que le processus initial 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]
Premièrement, "l'ancêtre" n'est pas la même chose que "Parent". L'ancêtre peut être le parent des parents des parents, et le noyau ne tient qu'une piste d'un 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 également quelques processus qui exécutent un code de noyau, mais sont gérés en tant que processus d'utilisateurs, en ce qui concerne la planification. (Ils n'obéissent pas aux règles de gestion de la mémoire habituelles puisqu'elles utilisent le code du noyau.) Ces processus sont tous générés par kthreadd
(c'est l'init de threads de noyau). Vous pouvez les reconnaître par leur identifiant de processus parent (2) ou, généralement, par le fait que ps
les énumère avec un nom entre crochets ou par le fait que /proc/2/exe
(Normalement, un lien symbolique à 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, de sorte qu'ils n'ont pas de parent. La valeur 0 est utilisée dans leur champ PPID pour indiquer cela. Pensez à 0 comme signifiant "le noyau lui-même" ici.
Linux dispose également de certaines installations pour le noyau pour démarrer les 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 du module (par exemple lorsque le nouveau matériel est découvert, ou lorsque certains protocoles de réseau sont utilisés pour la première fois) en appelant le programme dans le kernel.modprobe
valeur SYSCTL. Lorsqu'un programme décharge du noyau, le noyau appelle le programme indiqué par kernel.core_pattern
le cas échéant.