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