Linux-Kernel

理解pid_max、ulimit -u和thread_max的區別

  • March 25, 2021

我正在嘗試了解 Linux 程序。我對各自的術語感到困惑pid_maxulimit -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 中擁有的元素(程序)的最大數量。

我希望這能解決問題。

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