Linux
初始化程序:所有程序的祖先?
我一直都知道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]
首先,“祖先”與“父母”不同。祖先可以是父母的父母的……父母的父母,核心只跟踪一個級別。但是,當一個程序死亡時,它的子程序會被 init 採用,因此您會在典型系統上看到很多父程序為 1 的程序。
現代 Linux 系統還有一些執行核心程式碼的程序,但就調度而言,它們作為使用者程序進行管理。(它們不遵守通常的記憶體管理規則,因為它們正在執行核心程式碼。)這些程序都是由
kthreadd
(它是核心執行緒的 init)產生的。/proc/2/exe
您可以通過無法讀取(通常是指向程序執行檔的符號連結)這一事實來辨識它們。此外,ps
用方括號之間的名稱列出它們(這對於普通使用者程序是可能的,但不常見)。大多數父程序 ID 為 2 的程序是核心程序,但也有一些 PPID 為 2 的核心輔助程序(見下文)。程序 1 (
init
) 和 2 (kthreadd
) 在啟動時由核心直接創建,因此它們沒有父程序。在他們的 ppid 欄位中使用值 0 來表明這一點。在這裡將 0 視為“核心本身”的意思。Linux 還為核心提供了一些工具來啟動使用者程序,這些使用者程序的位置在某些情況下通過sysctl 參數指示。例如,核心可以通過呼叫
kernel.modprobe
sysctl 值中的程序來觸發模組載入事件(例如,當發現新硬體時,或者當首次使用某些網路協議時)。當程序轉儲核心時,核心會呼叫由kernel.core_pattern
if any 指示的程序。這些程序是使用者程序,但它們的父程序註冊為kthreadd
.