proceso init: ¿ancestro de todos los procesos?

26

Siempre he aprendido que el proceso init es el antepasado de todos los procesos. ¿Por qué el proceso 2 tiene 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
fuente

Respuestas:

32

Primero, "ancestro" no es lo mismo que "padre". El antepasado puede ser el padre del padre ... el padre del padre, y el núcleo solo realiza un seguimiento de un nivel. Sin embargo, cuando un proceso muere, sus hijos son adoptados por init, por lo que verá muchos procesos cuyo padre es 1 en un sistema típico.

Los sistemas Linux modernos además tienen algunos procesos que ejecutan código del núcleo, pero se administran como procesos de usuario, en lo que respecta a la programación. (No obedecen las reglas habituales de administración de memoria ya que están ejecutando el código del kernel). Todos estos procesos se generan kthreadd(es el inicio de los hilos del kernel). Puede reconocerlos por su ID de proceso principal (2) o, por lo general, por el hecho de que los psenumera con un nombre entre corchetes o por el hecho de que /proc/2/exe(normalmente un enlace simbólico al ejecutable del proceso) no se puede leer.

Los procesos 1 ( init) y 2 ( kthreadd) son creados directamente por el kernel en el momento del arranque, por lo que no tienen un padre. El valor 0 se usa en su campo ppid para indicar eso. Piense que 0 significa "el núcleo en sí" aquí.

Linux también tiene algunas facilidades para que el núcleo inicie procesos de usuario cuya ubicación se indica mediante un parámetro sysctl en ciertas circunstancias. Por ejemplo, el kernel puede desencadenar eventos de carga del módulo (por ejemplo, cuando se descubre un nuevo hardware o cuando se utilizan por primera vez algunos protocolos de red) llamando al programa en el kernel.modprobevalor sysctl. Cuando un programa volca el núcleo, el núcleo llama al programa indicado por kernel.core_patternsi lo hay.

Gilles 'SO- deja de ser malvado'
fuente
1
Entonces, ¿ inites el "antepasado" de todos user threads, mientras que [kthreadd ]es el "padre" de todos kernel threads, ¿verdad? ¡Gracias!
Nan Xiao
1
@NanXiao Principalmente, sí. Como mencioné en mi último párrafo, hay algunas otras formas para que los procesos de usuario sean iniciados por el núcleo, por ejemplo, el programa que aparece kernel.core_patterncuando un programa volca el núcleo. En un sistema típico, no los verá porque esos procesos tienden a hacer su trabajo rápidamente y luego salen.
Gilles 'SO- deja de ser malvado'