理解pid_max、ulimit -u和thread_max的區別
我正在嘗試了解 Linux 程序。我對各自的術語感到困惑
pid_max
,ulimit -u
並且thread_max
。這些術語之間究竟有什麼區別?有人可以澄清差異嗎?
讓我們了解程序和執行緒之間的區別。根據這個連結,
典型的區別是(同一程序的)執行緒在共享記憶體空間中執行,而程序在不同的記憶體空間中執行。
現在,我們有了
pid_max
可以確定如下的參數。cat /proc/sys/kernel/pid_max
所以上面的命令返回32,768,這意味著我可以在我的系統中同時執行32,768個程序,這些程序可以在不同的記憶體空間中執行。
現在,我們有了
threads-max
可以確定如下的參數。cat /proc/sys/kernel/threads-max
上面的命令將輸出返回為126406,這意味著我可以在共享記憶體空間中擁有126406 個執行緒。
現在,讓我們採用第三個參數
ulimit -u
,它表示使用者在特定時間可以擁有的總程序。上面的命令將輸出返回為63203。這意味著對於使用者在某個時間點創建的所有程序,使用者可以執行63203 個程序。假設案例
因此,假設有 2 個程序同時由 2 個使用者執行,並且每個程序都在大量消耗記憶體,那麼這兩個程序都將有效地使用程序的63203使用者限制。因此,如果是這種情況,這 2 個使用者將有效地用完整個126406
threads-max
大小。現在,我需要確定使用者在任何時間點可以執行多少個程序。這可以從文件中確定,
/etc/security/limits.conf
. 因此,此文件中基本上有 2 個設置,如此處所述。軟限制就像警告,硬限制是真正的最大限制。例如,關注將阻止學生組中的任何人擁有超過 50 個程序,並在 30 個程序時發出警告。
@student hard nproc 50 @student soft nproc 30
硬限制由核心維護,而軟限制由 shell 強制執行。
抱歉,接受的答案在幾個方面都是錯誤的資訊。
/proc/sys/kernel/pid_max
與在任何給定時間可以執行的最大程序數無關。事實上,它是核心可以分配的最大數值 PROCESS IDENTIFIER。在Linux核心中,程序和執行緒是一回事。核心以相同的方式處理它們。它們都在 task_struct 資料結構中佔據一個位置。用通用術語來說,執行緒在 Linux 中是一個與另一個程序共享資源的程序(它們也將共享一個執行緒組 ID)。就調度程序而言,Linux 核心中的執行緒在很大程度上是一個概念結構。
既然您了解核心在很大程度上不區分執行緒和程序,那麼
/proc/sys/kernel/threads-max
實際上資料結構 task_struct 中包含的最大元素數應該更有意義。這是包含程序列表的資料結構,或者可以稱為任務列表。ulimit 顧名思義,是每個使用者的限制。該
-u
標誌定義為“單個使用者可用的最大程序數”。task_struct 的一個元素包含創建任務的使用者的 uid。每次從 task_struct 添加/刪除任務時,都會維護每個 uid 計數並遞增/遞減。因此,ulimit -u
表示一個特定使用者在任何給定時間允許在 task_struct 中擁有的元素(程序)的最大數量。我希望這能解決問題。