По-перше, "предок" - це не те саме, що "батько". Родоначальником може бути батьківський батько батьків… батько, і ядро відстежує лише один рівень. Однак, коли процес помирає, його діти усиновляються за допомогою 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, правда? Дякую!