Linux

Linux核心執行緒真的是核心程序嗎?

  • March 1, 2021

我在很多地方讀到 Linux 為 Java VM 中的每個使用者執行緒創建了一個核心執行緒。(我看到術語“核心執行緒”以兩種不同的方式使用:

  1. 為執行核心作業系統工作而創建的執行緒和
  2. 作業系統知道並安排執行使用者工作的執行緒。

我說的是後一種類型。)

核心執行緒是否與核心程序相同,因為 Linux 程序支持父子之間的共享記憶體空間,或者它真的是一個不同的實體?

Linux 上的執行緒和程序之間絕對沒有區別。如果您查看clone(2),您將看到一組標誌,這些標誌確定執行緒之間共享的內容和不共享的內容。

經典程序只是不共享任何東西的執行緒;你可以在 Linux 下分享你想要的組件。

在其他作業系統實現中情況並非如此,在這些實現中存在更多實質性差異。

文件可能很混亂,所以這裡是“真正的”Linux 模型:

  • 在 Linux 核心中,可以執行(和調度)的東西稱為“程序”,
  • 每個程序都有一個系統唯一的程序 ID (PID) 和一個執行緒組 ID (TGID),
  • “正常”程序的 PID=TGID 並且沒有其他程序共享此 TGID 值,
  • “執行緒”程序是 TGID 值由其他程序共享的程序,
  • 共享相同 TGID 的多個程序也至少共享相同的記憶體空間和信號處理程序(有時更多),
  • 如果一個“執行緒”程序的PID=TGID,它可以被稱為“主執行緒”,
  • 從任何程序呼叫getpid()都將返回其 TGID(=“主執行緒”PID),
  • 從任何程序呼叫gettid()都將返回其 PID (!),
  • 可以使用clone(2)系統呼叫創建任何類型的程序,
  • 程序之間共享的內容是通過將特定標誌傳遞給來決定的clone(2)
  • 您可以列出的文件夾的數字名稱與TGID 一樣ls /proc/proc/NUMBER
  • 文件夾的數字名稱/proc/TGID/task/proc/TGID/task/NUMBERPID 一樣,
  • 即使您沒有看到每個現有的 PID ls /proc,您仍然可以這樣做cd /proc/any_PID

結論:從核心的角度來看,只有程序存在,每個程序都有自己唯一的 PID,所謂的執行緒只是一種不同的程序(至少與一個或多個共享相同的記憶體空間和信號處理程序)其他)。

注意: “執行緒”概念在 Linux 中的實現導致了詞彙混亂,如果getpid() 對你撒謊並沒有按照你的想法行事,那是因為它的行為遵循 POSIX 兼容性(執行緒應該共享一個公共 PID) .

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