Что такое процесс kthreadd и дети и как он отличается от init и children

Я хотел знать, что такое kthread и почему он не требует никакой памяти и не имеет открытых файлов. Я написал код, который просто напечатает PID текущих запущенных процессов в родительском древовидном формате вместе с некоторой дополнительной информацией, например, с использованием VMZ, RSS, потоков, openfiles. Все дочерние элементы PID 2 с именем kthreadd не содержали VmSize и VmRSS в файле /proc/[pid]/status. /proc/[pid]/fd не содержал открытых файлов.

Каковы эти процессы, как они отличаются от обычных процессов, порожденных init (PID 1). Я прочитал (в старой книге), что swapper будет порождать init PID1, а весь другой процесс - это дети PID 1. Определенно, за этим стоит другая архитектура (ядро Linux 3.7.10.1-16), которое я не знаю, поэтому другой вопрос - почему PID 2 является дочерним элементом PID 0 и не является дочерним элементом PID 1.

Ответ 1

Нити ядра не являются дочерними элементами init, поскольку их можно запустить перед всеми процессами пользовательского пространства.

Они обычно используются для управления оборудованием, поэтому они напрямую обрабатываются ядром и имеют высокий приоритет.

Чтобы процесс был дочерним элементом init, он должен быть клонирован из init, а Kthreads не являются тем, почему их родительский PID равен 0, что означает "нет".

Все процессы в пользовательском пространстве обычно имеют ПИД-код, превосходящий 1000, только потоки ядра имеют PID, меньший 1000.