Linux
Linux核心執行緒真的是核心程序嗎?
我在很多地方讀到 Linux 為 Java VM 中的每個使用者執行緒創建了一個核心執行緒。(我看到術語“核心執行緒”以兩種不同的方式使用:
- 為執行核心作業系統工作而創建的執行緒和
- 作業系統知道並安排執行使用者工作的執行緒。
我說的是後一種類型。)
核心執行緒是否與核心程序相同,因為 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/NUMBER
PID 一樣,- 即使您沒有看到每個現有的 PID
ls /proc
,您仍然可以這樣做cd /proc/any_PID
。結論:從核心的角度來看,只有程序存在,每個程序都有自己唯一的 PID,所謂的執行緒只是一種不同的程序(至少與一個或多個共享相同的記憶體空間和信號處理程序)其他)。
注意: “執行緒”概念在 Linux 中的實現導致了詞彙混亂,如果
getpid()
對你撒謊並沒有按照你的想法行事,那是因為它的行為遵循 POSIX 兼容性(執行緒應該共享一個公共 PID) .