執行緒與並行模型
一對一模型(one-to-one model)
現在給團隊裡每位工人各自一條專屬電話線。每個人都能獨立撥號,而若有人被掛在等候中,其他人照樣打電話,沒有人被別人卡住。一對一模型把每一條使用者層級執行緒對映到它自己專屬的一條核心執行緒。核心個別看見每一條執行緒,並能各自排程。
具體來說,在一對一裡,你的程式一建立執行緒,作業系統就建立一條相對應的核心執行緒,一對一配對。因為每條執行緒都是核心可獨立排程的個體,核心可以同時把同一行程的不同執行緒安排到不同的 CPU 核心上,得到真正的平行。而且如果一條執行緒做了會阻塞的系統呼叫,核心只要去跑這個行程的另一條執行緒即可,其餘照常進行。正是這種直接性,使一對一成為 Linux、Windows 與大多數現代系統採用的模型。
代價就是配對裡內建的取捨:建立一條使用者執行緒現在意味著建立一條核心執行緒,這是比純使用者空間切換更重的核心操作,而每條核心執行緒都消耗核心資源。因此系統常常會限制一個行程能建立多少執行緒,而隨意產生執行緒(每個微小任務各一條)會浪費時間與記憶體,這正是執行緒池模式所要解決的問題。和多對一相比,你得到平行與抗阻塞能力;和多對多相比,你用一些彈性和略高的每執行緒成本,換取了簡單。
在 Linux 上,呼叫 pthread_create() 會讓核心一對一地建立一條新的可排程執行緒。一個四執行緒的運算工作於是真的散布到四個核心上,而當執行緒 A 因讀檔阻塞時,執行緒 B、C、D 照常進行,這正是多對一做不到的。
每條執行緒各有一條核心執行緒,得到真正的平行,代價是建立成本較高。
一對一帶來真正的平行與抗阻塞能力,但每條執行緒都是核心執行緒,所以建立上千條代價很高,許多系統會限制執行緒數量,這正是執行緒池重要的原因。
又称
另见