Process

當您用完 PID 時會發生什麼?

  • July 24, 2020

這是一個純粹的學術問題,因為這永遠不會發生。

如果 PID 儲存為 pid_t 類型,而不是某種任意精度類型,那麼一次可以存在的 PID 數量是有限的。PID 溢出時是否有定義的行為?

第 65536 個程序會殺死 /sbin/init 並造成核心恐慌嗎?還是有什麼安全措施?

系統fork呼叫應返回 -1,並設置errnoEAGAIN。之後會發生什麼將取決於呼叫fork.

叉子

如果出現以下情況,fork() 函式將失敗:

$$ EAGAIN $$ 系統缺乏創建另一個程序所需的資源,或者係統對系統範圍內或單個使用者 {CHILD_MAX} 正在執行的程序總數的限制將被超過。

POSIX 並沒有規定每個新程序的 PID 是通過增加前一個 PID 來獲得的。它只要求它是唯一的。

在每個 PID 遞增的系統上fork(),我觀察到這些值在達到某個上限(根據我的經驗約為 2 15)後會迴繞。迴繞後,新的 PID 不會嚴格遞增,因為某些 PID 值仍將在以前的周期中使用。

在您有 2 N 個同時執行的程序之前,應該不會有問題。我懷疑系統會在這種情況發生之前很久就遇到一些容量限制。在這種情況下,fork()系統呼叫將失敗,並可能設置errnoEAGAINENOMEMman fork詳細資訊)。

實現的程式碼fork可能會或可能不會檢查是否有任何 PID 可用。它可能不會打擾,因為它假設系統資源在到達那個點之前就已經用完了,或者它可能為了完整性和處理未來的可能性而進行了明確的檢查。我還沒有檢查過,如果有的話,我只能解決我看過的任何核心。

更新:在我目前的系統(Ubuntu 20.04)上,最大 PID 為 2 22,如下所示:

$ cat /proc/sys/kernel/pid_max
4194304

來自man proc

/proc/sys/kernel/pid_max(從 Linux 2.5.34 開始)

此文件指定 PID 環繞的值(即,此文件中的值比最大 PID 大一)。大於此值的 PID 不會被分配;因此,此文件中的值也可作為系統範圍內程序和執行緒總數的限制。該文件的預設值 32768 會產生與早期核心相同的 PID 範圍。在 32 位平台上,32768 是 pid_max 的最大值。在 64 位系統上,pid_max 可以設置為最大為 2^22 的任何值(PID_MAX_LIMIT,大約 400 萬)。

但是具體的最大值可能與該問題並沒有太大的關係,除了您擁有 4+ 百萬個程序的可能性甚至比擁有超過 32767 個的可能性更小。

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