processus init: ancêtre de tous les processus?

26

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]
Mathieu Larose
la source

Réponses:

32

Premièrement, «ancêtre» n'est pas la même chose que «parent». L'ancêtre peut être le parent du parent… parent du parent, et le noyau ne garde qu'une trace d'un niveau. Cependant, quand 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 en tant que processus utilisateur, en ce qui concerne la planification. (Ils n'obéissent pas aux règles de gestion de la mémoire habituelles car ils exécutent du code noyau.) Ces processus sont tous engendré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 qu'ils les psrépertorient 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.

Les 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 la kernel.modprobevaleur sysctl. Lorsqu'un programme vide le noyau, le noyau appelle le programme indiqué par le kernel.core_patterncas échéant.

Gilles 'SO- arrête d'être méchant'
la source
1
Il en initest de même de «l'ancêtre» de tous user threads, tandis que [kthreadd ]le «parent» de tous kernel threads, n'est-ce pas? THX!
Nan Xiao
1
@NanXiao Surtout, oui. Comme je le mentionne dans mon dernier paragraphe, il existe quelques autres façons pour les processus utilisateur d'être démarrés par le noyau, par exemple le programme répertorié dans kernel.core_patternlorsqu'un programme vide le noyau. Sur un système typique, vous ne les verrez pas car ces processus ont tendance à faire leur travail rapidement puis à se terminer.
Gilles 'SO- arrête d'être méchant'