Во-первых, «предок» - это не то же самое, что «родитель». Предком может быть родитель родителя… родителя родителя, а ядро отслеживает только один уровень. Однако, когда процесс умирает, его дочерние элементы принимаются init, поэтому вы увидите много процессов, чей родитель равен 1 в типичной системе.
Современные системы Linux дополнительно имеют несколько процессов, которые выполняют код ядра, но управляются как пользовательские процессы, что касается планирования. (Они не подчиняются обычным правилам управления памятью, так как они выполняют код ядра.) Все эти процессы порождаются kthreadd
(это инициализация потоков ядра). Вы можете распознать их по идентификатору родительского процесса (2) или, как правило, по тому факту, что ps
перечислите их с именем в квадратных скобках или по тому факту, что /proc/2/exe
(обычно символическая ссылка на исполняемый файл процесса) не может быть прочитана.
Процессы 1 ( init
) и 2 ( kthreadd
) создаются непосредственно ядром во время загрузки, поэтому у них нет родителя. Значение 0 используется в их поле ppid, чтобы указать это. Думайте о 0 как о значении «само ядро» здесь.
В Linux также есть некоторые возможности для ядра запускать пользовательские процессы, местоположение которых указывается с помощью параметра sysctl при определенных обстоятельствах. Например, ядро может инициировать события загрузки модуля (например, при обнаружении нового оборудования или при первом использовании некоторых сетевых протоколов), вызывая программу со kernel.modprobe
значением sysctl. Когда программа выгружает ядро, ядро вызывает программу, обозначенную, kernel.core_pattern
если она есть.
init
является ли «предок» всегоuser threads
, а[kthreadd ]
«родителем» всегоkernel threads
, верно? Спасибо!