多线程

本页使用了标题或全文手工转换,现处于澳门繁体模式
本页使用了标题或全文手工转换,现处于澳门繁体模式
求聞百科,共筆求聞
「多线程」的各地常用別名
中國內地多線程
中國台灣多線、多執行緒
港澳多線程
一個行程(process)含有兩個线程(threads)的執行

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

軟件多线程。即便處理器只能執行一個线程作業系統也可以通過快速的在不同线程之間進行切換,由於時間間隔很小,來給用戶造成一種多個线程同時執行的假象。這樣的程式執行機制被稱為軟件多线程。如微軟的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 等,那就能夠讓虛擬機器去創造各式线程。這樣子就允許在相同的處理器中每個线程跑各自的作業系統。換句話說,如果只有儲存了用戶模式的狀態,就能夠讓相同的裸晶大小的晶片在一段時間內處理更多的线程。

參見

外部連結