proces inicjujący: przodek wszystkich procesów?

26

Zawsze nauczyłem się, że proces inicjujący jest przodkiem wszystkich procesów. Dlaczego proces 2 ma PPID równy 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]
Mathieu Larose
źródło

Odpowiedzi:

32

Po pierwsze, „przodek” nie jest tym samym, co „rodzic”. Przodek może być rodzicem rodzica… rodzicem rodzica, a jądro śledzi tylko jeden poziom. Jednak gdy proces umiera, jego dzieci są adoptowane przez init, więc zobaczysz wiele procesów, których rodzic ma 1 w typowym systemie.

Nowoczesne systemy Linux mają dodatkowo kilka procesów, które wykonują kod jądra, ale pod względem planowania są zarządzane jako procesy użytkownika. (Nie przestrzegają zwykłych reguł zarządzania pamięcią, ponieważ uruchamiają kod jądra.) Wszystkie te procesy są odradzane przez kthreadd(jest to inicjacja wątków jądra). Można je rozpoznać po ich nadrzędnym identyfikatorze procesu (2) lub zwykle po tym, że pszawiera je nazwa w nawiasach kwadratowych lub po tym, że /proc/2/exe(zwykle symboliczne łącze do pliku wykonywalnego procesu) nie może zostać odczytane.

Procesy 1 ( init) i 2 ( kthreadd) są tworzone bezpośrednio przez jądro w czasie rozruchu, więc nie mają elementu nadrzędnego. Wartość 0 jest używana w ich polu ppid, aby to wskazać. Pomyśl o 0 jako o znaczeniu „samego jądra” tutaj.

Linux ma również pewne funkcje dla jądra do uruchamiania procesów użytkownika, których lokalizacja jest wskazywana przez parametr sysctl w określonych okolicznościach. Na przykład jądro może wyzwalać zdarzenia ładowania modułu (np. Kiedy zostanie wykryty nowy sprzęt lub gdy po raz pierwszy zostaną użyte niektóre protokoły sieciowe) poprzez wywołanie programu o kernel.modprobewartości sysctl. Kiedy program zrzuca rdzeń, jądro wywołuje program wskazany przez, kernel.core_patternjeśli istnieje.

Gilles „SO- przestań być zły”
źródło
1
A więc init„przodek” wszystkich user threads, podczas [kthreadd ]gdy „rodzic” wszystkich kernel threads, prawda? Dzięki!
Nan Xiao
1
@NanXiao Głównie tak. Jak wspomniałem w poprzednim akapicie, istnieje kilka innych sposobów uruchamiania procesów użytkownika przez jądro, np. Program wymieniony, kernel.core_patterngdy program zrzuca rdzeń. W typowym systemie ich nie zobaczysz, ponieważ te procesy zwykle wykonują swoją pracę szybko, a następnie wychodzą.
Gilles „SO- przestań być zły”