當您用完 PID 時會發生什麼?
這是一個純粹的學術問題,因為這永遠不會發生。
如果 PID 儲存為 pid_t 類型,而不是某種任意精度類型,那麼一次可以存在的 PID 數量是有限的。PID 溢出時是否有定義的行為?
第 65536 個程序會殺死 /sbin/init 並造成核心恐慌嗎?還是有什麼安全措施?
系統
fork
呼叫應返回 -1,並設置errno
為EAGAIN。之後會發生什麼將取決於呼叫fork
.從叉子:
如果出現以下情況,fork() 函式將失敗:
$$ EAGAIN $$ 系統缺乏創建另一個程序所需的資源,或者係統對系統範圍內或單個使用者 {CHILD_MAX} 正在執行的程序總數的限制將被超過。
POSIX 並沒有規定每個新程序的 PID 是通過增加前一個 PID 來獲得的。它只要求它是唯一的。
在每個 PID 遞增的系統上
fork()
,我觀察到這些值在達到某個上限(根據我的經驗約為 2 15)後會迴繞。迴繞後,新的 PID 不會嚴格遞增,因為某些 PID 值仍將在以前的周期中使用。在您有 2 N 個同時執行的程序之前,應該不會有問題。我懷疑系統會在這種情況發生之前很久就遇到一些容量限制。在這種情況下,
fork()
系統呼叫將失敗,並可能設置errno
為EAGAIN
或ENOMEM
(man 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 個的可能性更小。