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 ps
zawiera 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.modprobe
wartości sysctl. Kiedy program zrzuca rdzeń, jądro wywołuje program wskazany przez, kernel.core_pattern
jeśli istnieje.
init
„przodek” wszystkichuser threads
, podczas[kthreadd ]
gdy „rodzic” wszystkichkernel threads
, prawda? Dzięki!kernel.core_pattern
gdy program zrzuca rdzeń. W typowym systemie ich nie zobaczysz, ponieważ te procesy zwykle wykonują swoją pracę szybko, a następnie wychodzą.