Process

為什麼程序不填充空的程序ID

  • April 11, 2016

每個人都知道 PID 編號 1 是 systemd(或等效的)。之後的每個程序都需要另一個 PID,並不斷增加。

但是,當有 50 個程序正在執行(最多 PID 50)並且 PID 2 的程序終止並啟動一個新程序時,它不會是 PID 2,而是 PID 51。這是為什麼?

我注意到,例如使用文件描述符,它不是那樣的,而是當我關閉文件描述符 4 並打開一個新的文件描述符時,它將具有數字 4。

大多數 Unix 變體按順序分配程序 ID:1、2、3、4……當達到可能的最大 PID 值時,它們會從 1 重新開始,跳過已經存在的 PID。

這不是義務。例如,OpenBSD 隨機分配 PID,而不是按順序分配;這也是 FreeBSD 上的一個選項。目標是提高安全性,儘管好處是可疑的

這種行為有一個(可疑的)優勢:它使得程序 ID 在程序終止後立即被重用的情況很少見。有許多程序可以監視程序並假設在程序死亡後,PID 將不會被使用——如果 PID 被新程序使用,則會中斷。這些程序確實有一個藉口:沒有好的 API 可以監控一個程序,除了它的父程序。但是這樣的程序非常普遍,以至於 OpenBSD 避免在程序死亡後的一段時間內(如果我沒記錯的話,幾分鐘)重用 PID。

這種行為的主要原因是它是在傳統的 Unix 系統上完成的,沒有充分的理由改變。對於文件描述符,Unix 歷史上使用第一個空閒 fd 編號,並且該行為已成為官方標準,因此所有 Unix/POSIX 系統都必須這樣做。

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