Linux

初始化程序:所有程序的祖先?

  • December 16, 2021

我一直都知道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.modprobesysctl 值中的程序來觸發模組載入事件(例如,當發現新硬體時,或者當首次使用某些網路協議時)。當程序轉儲核心時,核心會呼叫由kernel.core_patternif any 指示的程序。這些程序是使用者程序,但它們的父程序註冊為kthreadd.

引用自:https://unix.stackexchange.com/questions/13290