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

「多線程」的各地常用名稱
中國大陸多線程
臺灣多線、多執行緒
港澳多線程
一個行程(process)含有兩個線程(threads)的執行

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

除此之外,許多系統及處理器也支援硬件多線程技術對稱多處理機(SMP)系統具有多個處理器,所以具有真正的同時執行多個線程的能力;CMP技術通過在一塊晶片上整合多個核心(Core)也具有真正的多線程能力;CMT技術則稍有不同,有的是依靠硬件執行線程切換來獲得多線程能力,作業系統不再負責線程切換,因而這部分開銷可以減少甚至消除,這方面典型的例子是SunUltraSPARC 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 等共用資源也要加大來避免不同線程之間的衝突。

範例

同步多線程

概念

目前最先進的多線程技術是應用在超純量處理器上。超純量處理器內在每個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這類共用的資源可能會因為多出來的線程而變得更大。

範例

實作

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

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

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

參見

外部連結