Primeiro, “ancestral” não é a mesma coisa que “pai”. O ancestral pode ser o pai do pai ... o pai do pai, e o kernel apenas controla um nível. No entanto, quando um processo morre, seus filhos são adotados pelo init, portanto, você verá muitos processos cujo pai é 1 em um sistema típico.
Além disso, os sistemas Linux modernos possuem alguns processos que executam o código do kernel, mas são gerenciados como processos do usuário, no que diz respeito ao agendamento. (Eles não obedecem às regras usuais de gerenciamento de memória, pois estão executando o código do kernel.) Esses processos são gerados por kthreadd
(é o início dos threads do kernel). Você pode reconhecê-los pelo ID do processo pai (2) ou, geralmente, pelo fato de os ps
listar com um nome entre colchetes ou pelo fato de que /proc/2/exe
(normalmente um link simbólico para o executável do processo) não pode ser lido.
Os processos 1 ( init
) e 2 ( kthreadd
) são criados diretamente pelo kernel no momento da inicialização, para que eles não tenham um pai. O valor 0 é usado em seu campo ppid para indicar isso. Pense em 0 como significando "o próprio kernel" aqui.
O Linux também possui algumas facilidades para o kernel iniciar processos do usuário cuja localização é indicada por meio de um parâmetro sysctl em determinadas circunstâncias. Por exemplo, o kernel pode acionar eventos de carregamento de módulo (por exemplo, quando um novo hardware é descoberto ou quando alguns protocolos de rede são usados pela primeira vez) chamando o programa no kernel.modprobe
valor sysctl. Quando um programa despeja o núcleo, o kernel chama o programa indicado por, kernel.core_pattern
se houver.
init
é o "ancestral" de todosuser threads
, enquanto[kthreadd ]
é o "pai" de todoskernel threads
, certo? THX!kernel.core_pattern
quando um programa despeja o núcleo. Em um sistema típico, você não os verá, porque esses processos tendem a fazer seu trabalho rapidamente e depois saem.