processo di init: antenato di tutti i processi?


26

Ho sempre imparato che il processo di init è l'antenato di tutti i processi. Perché il processo 2 ha un PPID di 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]

Risposte:


32

Innanzitutto, "antenato" non è la stessa cosa di "genitore". L'antenato può essere il genitore del genitore ... genitore del genitore e il kernel tiene traccia di un solo livello. Tuttavia, quando un processo muore, i suoi figli vengono adottati da init, quindi vedrai molti processi il cui genitore è 1 su un sistema tipico.

I moderni sistemi Linux hanno inoltre alcuni processi che eseguono il codice del kernel, ma sono gestiti come processi utente, per quanto riguarda la pianificazione. (Non obbediscono alle solite regole di gestione della memoria poiché eseguono il codice del kernel.) Questi processi sono tutti generati da kthreadd(è l'inizializzazione dei thread del kernel). È possibile riconoscerli dall'ID del processo principale (2) o, in genere, dal fatto che psli elenca con un nome tra parentesi quadre o dal fatto che /proc/2/exe(normalmente un collegamento simbolico all'eseguibile del processo) non può essere letto.

I processi 1 ( init) e 2 ( kthreadd) vengono creati direttamente dal kernel all'avvio, quindi non hanno un genitore. Il valore 0 viene utilizzato nel loro campo ppid per indicarlo. Pensa a 0 come significato "il kernel stesso" qui.

Linux ha anche alcune funzionalità per consentire al kernel di avviare i processi utente la cui posizione è indicata tramite un parametro sysctl in determinate circostanze. Ad esempio, il kernel può innescare eventi di caricamento del modulo (ad esempio quando viene scoperto nuovo hardware o quando vengono utilizzati per la prima volta alcuni protocolli di rete) chiamando il programma nel kernel.modprobevalore sysctl. Quando un programma scarica il core, il kernel chiama il programma indicato da kernel.core_patterneventuali.


1
Quindi initè l '"antenato" di tutti user threads, mentre [kthreadd ]il "genitore" di tutti kernel threads, giusto? Grazie!
Nan Xiao,

1
@NanXiao Principalmente sì. Come menziono nel mio ultimo paragrafo, ci sono alcuni altri modi in cui i processi utente possono essere avviati dal kernel, ad esempio il programma elencato kernel.core_patternquando un programma scarica il core. Su un sistema tipico non li vedrai perché quei processi tendono a fare rapidamente il loro lavoro e quindi a uscire.
Gilles 'SO- smetti di essere malvagio'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.