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 ps
enumera 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.modprobe
valor sysctl. Cuando un programa volca el núcleo, el núcleo llama al programa indicado por kernel.core_pattern
si lo hay.
init
es el "antepasado" de todosuser threads
, mientras que[kthreadd ]
es el "padre" de todoskernel threads
, ¿verdad? ¡Gracias!