了解 pid_max、ulimit -u 和 thread_max 之間的差異

了解 pid_max、ulimit -u 和 thread_max 之間的差異

我正在嘗試了解 Linux 進程。我對各自的術語pid_maxulimit -u感到困惑thread_max

這些術語到底有什麼差別?有人可以澄清這些差異嗎?

答案1

抱歉,接受的答案在幾個方面都是錯誤的訊息。

/proc/sys/kernel/pid_max與任何給定時間可以運行的最大進程數無關。事實上,它是核心可以分配的最大數字進程標識符。

在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 中擁有的最大元素(進程)數量。

我希望事情能夠澄清。

答案2

讓我們了解進程和執行緒之間的差異。按照關聯,

典型的區別是(同一進程的)執行緒在共享記憶體空間中運行,而進程在單獨的記憶體空間中運行。

現在,我們有了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進程的用戶限制。因此,如果是這種情況,這兩個用戶將有效地用完整個126406 threads-max尺寸。

現在,我需要確定使用者在任何時間點可以運行多少個進程。這可以從文件/etc/security/limits.conf.因此,該文件中基本上有 2 個設置,如上所述這裡

A軟限制就像一個警告硬限制是一個實際最大限制。例如,以下將阻止學生組中的任何人擁有超過 50 個進程,並在 30 個進程時發出警告。

@student        hard    nproc           50
@student        soft    nproc           30

硬限制由核心維護,而軟限制由 shell 強制執行。

相關內容