多线程与并发

**多執行緒**（英語：**multithreading**），是指從軟體或者硬體上實現多個執行緒並行執行的技術。具有多執行緒能力的電腦因有硬體支援而能夠在同一時間執行多於一個執行緒，進而提升整體處理效能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶片級多處理（Chip-level multithreading）或同時多執行緒（Simultaneous multithreading）處理器。

軟體多執行緒。即便處理器只能執行一個執行緒，作業系統也可以通過快速的在不同執行緒之間進行切換，由於時間間隔很小，來給使用者造成一種多個執行緒同時執行的假象。這樣的程式執行機制被稱為軟體多執行緒。如微軟的 Windows 作業系統和 Linux 就是在各個不同的執行緒間來回切換，被稱為單人多工作業系統。而 DOS 這類文字介面作業系統在一個時間只能處理一項工作，被視為單人單工作業系統。

除此之外，許多系統及處理器也支援硬體多執行緒技術。對稱多處理機（SMP）系統具有多個處理器，所以具有真正的同時執行多個執行緒的能力；CMP 技術通過在一塊晶片上整合多個核心（Core）也具有真正的多執行緒能力；CMT 技術則稍有不同，有的是依靠硬體執行執行緒切換來獲得多執行緒能力，作業系統不再負責執行緒切換，因而這部分開銷可以減少甚至消除，這方面典型的例子是 Sun 的 UltraSPARC T1，它同時綜合了 CMP 和 CMT。微軟的 Windows 2000 以後的作業系統皆支援多執行緒與超執行緒技術。

## 概觀

由於程式碼中存在的資料及控制依賴關係，單執行緒中所能發掘的指令並行潛力是有限的。為了發掘有限的指令級並行潛力而一味強化亂序執行和分支預測，以至於處理器複雜度和功耗急劇上升，有時候是得不償失的。因此，現代微處理器多採用硬體多執行緒技術來發掘執行緒之間的執行緒級並行潛力。這樣子允許在介面轉換的專業領域之運算能力大幅提升：

* 既使這樣做對於提升單一程式或是執行緒的效能相當困難，但是目前多數的系統都是使用多工的方式作業。
* 能夠明顯的提升整體系統運算能力，總體吞吐量獲得提升。

有兩種提升運算能力的主要技術分別是多行程與多執行緒。

不過有些對多執行緒的批評如下：

* 當共享硬體資源（像是快取或是 TLB）時多執行緒會造成干預。
* 單執行緒的執行時間可能不會因為多執行緒而變短。硬體偵測技術有可能改變這一狀況。
* 多執行緒的硬體支援會牽涉到軟體支援，如此程式與作業系統就需要比多程序化更大幅度的修改。

## 粗粒度交替多執行緒

### 概念

一個執行緒持續執行，直到該執行緒被一個事件擋住而製造出長時間的延遲 (可能是記憶體 load/store 操作，或者程式分支操作)。該延遲通常是因快取失敗而從核心外的記憶體讀寫，而這動作會使用到幾百個 CPU 週期才能將資料回傳。與其要等待延遲的時間，執行緒化處理器會切換執行到另一個已就緒的執行緒。只要當之前執行緒中的資料送達後，上一個執行緒就會變成已就緒的執行緒。這種方法來自各個執行緒的指令交替執行，可以有效的掩蓋記憶體存取時延，填補管線空洞。

舉例來說：

1. 週期 i ：接收執行緒 A 的指令 j
2. 週期 i+1：接收執行緒 A 的指令 j+1
3. 週期 i+2：接收執行緒 A 的指令 j+2，而這指令快取失敗
4. 週期 i+3：執行緒排程器介入，切換到執行緒 B
5. 週期 i+4：接收執行緒 B 的指令 k
6. 週期 i+5：接收執行緒 B 的指令 k+1

在概念上，它與即時作業系統中使用的合作式多工類似，在該任務需要為一個事件等待一段時間的時候會主動放棄執行時段。

### 硬體成本

此種多執行緒硬體支援的目標，是允許在擋住的執行緒與已就緒的執行緒中快速切換。為了要達成這個目標，硬體成本將複製程式看得見的暫存器與一些處理器控制暫存器（像是程式計算器）。從一個執行緒切換到另一個執行緒對硬體來講意謂著從一個暫存器複製到另一個。

這些新增功能的硬體有這些優勢：

* 執行緒切換能夠在一個 CPU 週期內完成 (實際上可以沒有開銷，上個周期在執行執行緒 A，下個周期就已在執行執行緒 B)。
* 這樣子看起來像是每個執行緒是獨自執行的，沒有其他執行緒與目前共享硬體資源。對作業系統來說，通常每個虛擬執行緒都被視做一個處理器。這樣就不需要很大的軟體變更（像是特別寫支援多執行緒的作業系統）。

為了要在各個現行中的執行緒有效率的切換，每個現行中的執行緒需要有自己的暫存設定（register set）。像是為了能在兩個執行緒中快速切換，硬體的暫存器需要兩次例示（instantiated）。

### 範例

* 許多微控制器與嵌入式處理器有多重的暫存器列，就能夠在中斷時快速環境切換。這樣架構可以視為程式的執行緒與中斷執行緒之間的塊狀多執行緒處理。

## 細粒度交替式多執行緒

### 概念

另一種更高效能的多執行緒做法是將所有 CPU 週期輪流切換至不同的執行緒，來自各執行緒的指令按順序交替執行。執行過程很像桶形處理器 (Barrel Processor) 就像這樣：

1. 週期 i ：接收執行緒 A 的一個指令
2. 週期 i+1：接收執行緒 B 的一個指令
3. 週期 i+2：接收執行緒 C 的一個指令

這種執行緒的效果是會將所有從執行管線中的資料從屬（data dependency）關係移除掉。因為每個執行緒是相對獨立，管線中的一個指令階層需要從已跑完管線中的較舊指令代入輸出的機會就相對的變小了。

而在概念上，這種多執行緒與作業系統的核心先佔多工（pre-exemptive multitasking）相似。

### 硬體成本

除了討論**塊狀**多執行緒的硬體成本，**交錯式**多執行緒也因每層管線需要追蹤執行中指令的執行緒代碼而增加硬體成本。而且，當越來越多的執行緒同時在管線中執行，像是快取與 TLB 等共享資源也要加大來避免不同執行緒之間的衝突。

### 範例

* Denelcor Heterogeneous Element 處理器 (HEP)
* Intel Super-threading
* 昇陽 UltraSPARC T1
* Lexra NetVortex
* 搭載 Multi-Threaded ASE 的 MIPS 34K 核心
* Raza Microelectronics Inc XLR

## 同步多執行緒

### 概念

目前最先進的多執行緒技術是應用在超純量處理器上。超純量處理器內在每個 CPU 周期中，單獨一個執行緒會釋出眾多的指令。套用同步多執行緒 (SMT) 之後，超純量處理器就可以在每個 CPU 周期中，從多個執行緒中釋出指令。辨識到任何一個單一執行緒擁有有限數量的指令平行處理，這種類型的多執行緒是試著利用並行的方式跨越多執行緒，以減少浪費與閒置的資源。
舉例來說：

1. 週期 i：執行緒 A 的 j 指令 與 j+1 指令，還有 B 執行緒的指令 k 同時釋出
2. 週期 i+1：執行緒 A 的 j+2 指令、執行緒 B 的 k+1 指令，與執行緒 C 的 m 指令同時釋出
3. 週期 i+2：執行緒 A 的 j+3 指令，與執行緒 C 的 m+1 與 m+2 指令同時釋出

### 硬體成本

交錯式多執行緒如果不計硬體成本，SMT 在每個管線階層的追蹤執行緒指令會有多餘的花費。而且，像是快取與 TLB 這類共享的資源可能會因為多出來的執行緒而變得更大。

### 範例

* Alpha AXP EV8 (未完成)
* Intel 超執行緒
* IBM Power5
* Cell 微處理器 內的 Power 運算元件
* 昇陽 UltraSPARC T2
* 昇陽 Rock 微處理器
* AMD Bulldozer

## 實作

在大多數研究領域內是要求執行緒排程器要能夠快速選擇其中一個已就緒執行緒去執行，而不是一個一個執行而降低效率。所以要讓排程器去分辨執行緒的優先順序是很重要的。而執行緒排程器可能是以硬體、軟體，或是軟硬體並存的形式存在。

而另一個研究領域則是要研究何種事件（快取失敗、內部執行續連繫、使用 DMA 等）會造成執行緒切換。

如果多執行緒的方案會複製**所有**軟體可見的狀態，包括特許的控制登錄、TLB 等，那就能夠讓虛擬機器去創造各式執行緒。這樣子就允許在相同的處理器中每個執行緒跑各自的作業系統。換句話說，如果只有儲存了使用者模式的狀態，就能夠讓相同的裸晶大小的晶片在一段時間內處理更多的執行緒。

## 參見

* 執行緒

## 外部連結

* 兼聽則明 — 從 CMT 與 SMT 技術之爭談起
* 全方位了解伺服器 CPU【技術篇】（頁面存檔備份，存於網際網路檔案館）
* 精彩圖解伺服器 CPU（頁面存檔備份，存於網際網路檔案館）
* 提高處理器的吞吐量（IMPROVING THROUGHPUT）（頁面存檔備份，存於網際網路檔案館）