
執行緒
|
229
當代的系統程式設計者往往找不到這些替代方案吸引人之處。例如,非同步 I/O,往往
會氣死人。即使你可以經由共享記憶體以及其他共享資源來降低多個行程的成本,但是
無法消除環境切換的開銷。因此,執行緒不僅常見於系統程式設計,而且跨越整個軟體
疊層:從核心直到 GUI 應用程式。隨著多核 CPU 的日益盛行,執行緒的使用只會增加
不會減少。
執行緒模型
核心及用戶空間所提供之不同程度的功能,讓我們得以透過幾種方式在一個系統上實作
執行緒。最簡單的模型就是核心為執行緒所提供的原生支援,而且這些核心執行緒每個
都可以直接轉譯成執行緒的用戶空間概念。這種模型稱為「1:1 執行緒」,因為核心所提
供的執行緒與用戶所使用的執行緒存在一對一的關係。這種模型也稱為
核心層級執行
緒
(
kernel-level threading
),因為核心是系統之執行緒模型的關鍵所在。
Linux 所採用的就是 1:1 執行緒(我們將會在第 7 章〈Linux 的執行緒實作〉一節討論
到 )。 Linux 核心所實作的執行緒其實就是共享資源的行程。執行緒程式庫將會透過
clone()
系統呼叫來建立新的執行緒,而且所傳回的「行程」可以直接當成執行緒之用
戶空間概念來管理。也就是,Linux 上,用戶空間叫用執行緒的方式跟核心叫用執行緒
的方式差不多。
用戶層級執行緒
「N:1 執行緒」是一個完全相反的模型,也稱為
用戶層級執行緒
(
user-level
threading
)。與核心層級執行緒相反的是,在這種模型中,用戶空間是系統之執行緒支 ...