Процесс init: предок всех процессов?

26

Я всегда узнавал, что процесс init является прародителем всех процессов. Почему процесс 2 имеет PPID 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]
Матье Лароз
источник

Ответы:

32

Во-первых, «предок» - это не то же самое, что «родитель». Предком может быть родитель родителя… родителя родителя, а ядро ​​отслеживает только один уровень. Однако, когда процесс умирает, его дочерние элементы принимаются init, поэтому вы увидите много процессов, чей родитель равен 1 в типичной системе.

Современные системы Linux дополнительно имеют несколько процессов, которые выполняют код ядра, но управляются как пользовательские процессы, что касается планирования. (Они не подчиняются обычным правилам управления памятью, так как они выполняют код ядра.) Все эти процессы порождаются kthreadd(это инициализация потоков ядра). Вы можете распознать их по идентификатору родительского процесса (2) или, как правило, по тому факту, что psперечислите их с именем в квадратных скобках или по тому факту, что /proc/2/exe(обычно символическая ссылка на исполняемый файл процесса) не может быть прочитана.

Процессы 1 ( init) и 2 ( kthreadd) создаются непосредственно ядром во время загрузки, поэтому у них нет родителя. Значение 0 используется в их поле ppid, чтобы указать это. Думайте о 0 как о значении «само ядро» здесь.

В Linux также есть некоторые возможности для ядра запускать пользовательские процессы, местоположение которых указывается с помощью параметра sysctl при определенных обстоятельствах. Например, ядро ​​может инициировать события загрузки модуля (например, при обнаружении нового оборудования или при первом использовании некоторых сетевых протоколов), вызывая программу со kernel.modprobeзначением sysctl. Когда программа выгружает ядро, ядро ​​вызывает программу, обозначенную, kernel.core_patternесли она есть.

Жиль "ТАК - перестань быть злым"
источник
1
Так initявляется ли «предок» всего user threads, а [kthreadd ]«родителем» всего kernel threads, верно? Спасибо!
Нань Сяо
1
@NanXiao В основном да. Как я упоминал в моем последнем абзаце, есть несколько других способов запуска пользовательских процессов ядром, например, программа, указанная в списке, kernel.core_patternкогда программа выгружает ядро. В типичной системе вы их не увидите, потому что эти процессы, как правило, быстро выполняют свою работу и затем завершаются.
Жиль "ТАК - перестань быть злым"