processo init: ancestral de todos os processos?

26

Eu sempre aprendi que o processo init é o ancestral de todos os processos. Por que o processo 2 tem um 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
fonte

Respostas:

32

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 pslistar 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.modprobevalor sysctl. Quando um programa despeja o núcleo, o kernel chama o programa indicado por, kernel.core_patternse houver.

Gilles 'SO- parar de ser mau'
fonte
11
Então inité o "ancestral" de todos user threads, enquanto [kthreadd ]é o "pai" de todos kernel threads, certo? THX!
Nan Xiao
11
@ NanXiao Principalmente sim. Como mencionei no meu último parágrafo, existem algumas outras maneiras de os processos do usuário serem iniciados pelo kernel, por exemplo, o programa listado kernel.core_patternquando 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.
Gilles 'SO- stop be evil'