聊聊PID 那些事兒

PId?

計算機裏,每個進程在創建的時候會有一個唯一標識(process identifier)所以我們一般都管他們叫Process ID或者直接縮寫PID。

這個ID一般是由操作系統內核創建的(比如Unix、MacOS、Windows .etc),用來唯一標記一個活躍的進程。在函數調用時,這個PID可以作爲一個參數來使用,比如調整進程的優先級,或者終止進程等。

Unix繫系統

在Unix系的操作系統裏,新的進程會通過調用系統的
fork()
來創建。這個進程的PID會由父進程直接返回,方便以後的子進程進行調用。父進程有可能會通過waitpid()來等待子進程結束,或者直接調用kill()來殺掉這個進程。

但是有兩個task會擁有獨特的PID:swappersched用0作爲PID,因爲他們是用來做內存分頁的,其實講道理,他們應該算內核的一部分而不算用戶進程。PID 1 常用來標記初始化進程,主要用做啓動和關閉系統。本來 PID 1並不是專門預留的進程ID,只是因爲init 進程是計算機內核創建的第一個進程,所以init 進程基本上都會得到PID 1. 現在大部分都Unix操作系統已經有了其他的以進程形式存在的組件,但是初始化進程還是被標記爲PID 1,只是爲了和以前的系統保持一致(兼容)。

PID,一般都是從0開始分配,一直到系統定義的最大值。一旦到達了,就從300重新開始遞增。

MacOSHP-UX裏一般會從100開始重新分配。

那麼問題就來了,這個300/100是什麼梗?爲毛要從這裏開始而不是從…比如666開始?在Linux/Unix內核代碼裏面hardcode了一段
#define RESERVED_PIDS 300
emmm…目測只是因爲Linus同學一拍腦袋想出來的…whetever吧。參考這一頁

重新從300(100)開始之後,如果遇到已經分配過的PID就會跳過。所以有的人認爲這會是一個潛在的系統漏洞,因爲它需要允許進程讀取系統信息,或者在進程之間傳遞信息。爲此,爲了解決這個潛在的漏洞,可以選擇其他更復雜的PID分配算法。

在某些操作系統裏面,比如MPE/iX,使用最低可用PID,有時是爲了最小化內存中的進程信息內核頁面的數量。
這個PID是通過getpid()這個系統調用,或者通過shell命令$$。父進程的PID可以通過getppid()來獲取。

Linux裏面,最大的PID是記錄在/可以通過“僞”文件/proc/sys/kernel/pid_max訪問。

WIndows繫系統

Windows系統裏面,我們可以通過調用GetCurrentProcessId()來獲取當前的PID,或者通過調用GetProcessId()來獲取其他進程的PID。在系統內部,PID被稱爲client ID,而且它們和線程ID位於同一個命名空間裏,所以這兩兄弟是不會出現重合的。那個System Idle Process頂着PID0,系統進程頂着PID 4. 在某些版本的Windows,進程和線程ID都是4的倍數,不過這並不是一個標準設置。

PID文件

在某些進程中,比如moc音樂播放器或者MySQL的守護進程, 他們會寫自己本地的PID文件,同時也會允許其他進程訪問。

參考資料:wikipedia

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章