init process: родоначальник усіх процесів?


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програмі, коли програма скидає ядро. У типовій системі їх ви не побачите, оскільки ці процеси, як правило, швидко виконують свою роботу, а потім виходять.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.