瀏覽單個文章
NEAL
Golden Member
 
NEAL的大頭照
 

加入日期: Jun 2002
您的住址: Taiwan
文章: 2,668
我發現大家好像有點搞錯了,不然我簡單解釋一下,至少我在國家的資訊、電子高考都有拿過全國榜首或前三名,觀念上應該不會錯太離譜,撇開考試分數不談,觀念有錯的話,我實作的程式或電路應該不會動,賣出去應該會被K得滿頭包吧?不過CPU本身我就沒設計過,只能說就是讀得熟而已。

Thread在台灣譯名就是執行緒,大陸譯名就叫線程。

我從程式的觀念切入,逐步講到在CPU怎麼運作,大家比較有感覺。

比方說我今天寫了一支有GUI的程式碼,假設我在程式碼裡寫了一個無窮迴圈,會發生什麼事呢?

大家可以猜得出來,整個GUI執行到該無窮迴圈會像當機一樣,因為CPU瘋狂的執行迴圈,所以沒辦法再執行迴圈以後的程式碼,因此使用者去點擊GUI,GUI就像死當,不會回應。

因此工程師在寫這類型的Code時,就會呼叫Thread函式庫,把這個無窮迴圈包成一個函數,並且指定一個Thread去執行這個函數。此時這支程式有兩個Thread在執行,一個是GUI Thread,一個是迴圈的Thread。

當程式執行時,作業系統就會排程Thread的執行方式,使用者如果不操作GUI,就讓無窮迴圈Thread去佔滿CPU的資源;如果使用者去操作了GUI,作業系統就會觸發執行Context-Switch,要求CPU把暫存器(Registers)都騰出來,換成處理GUI Thread,所以使用者在操作GUI時,就不會覺得程式有當掉,但事實上是兩個Thread在CPU裡快速切換。

以上就是Thread在執行時,程式、OS、CPU三者的狀態。

這時候大家就會問個問題,那如果Thread越來越多,一天到晚都在Context-Switch,CPU做沒兩個指令就要把暫存器騰出來給別個Thread使用,這樣是不是很浪費時間沒效率?另外一點是,如果Thread A和B剛好是不衝突的,兩者用的是CPU裡不同功能方塊,這樣切換來切換去是不是很白痴,為什麼不要讓他們同時執行就好?

所以Intel也想到了,這就是為什麼Hyper-Threading會誕生。

Intel實作Hyper-Threading的方式,簡單來說就是讓一個CPU核心有兩套暫存器,但共用其他運算、控制功能方塊(ALU / CU),因為x86作業系統判定有幾顆CPU主要就是透過辨視有幾套x86暫存器,所以開了Hyper-Threading,就是把CPU裡每個核心的兩套暫存器都打開,作業系統就會以為多了一倍的CPU。

這樣一來就不難思考為什麼Hyper-Threading總是在某些情況特別管用,但有些情況就弱得要命。以上述的情況來思考,GUI Thread 和 無窮迴圈Thread 用的功能方塊不同,所以透過Hyper-Threading就能讓兩個Thread的指令都塞到同一顆CPU核心去同時執行,不用再Context Switch。但是如果遇到要平行計算的硬派應用,Hyper-Threading就不管用了,因為一堆Thread都搶著用CPU裡同一組ALU功能方塊,兩個Thread只好一前一後乖乖排隊,效能當然不會增加。

至於Pipeline,它是很早就出現的技術,它和Hyper-Threading沒有衝突或關聯,兩者可以分別使用,也能同時使用,共同點都是為了提升CPU裡功能方塊的利用率,不要讓這些功能方塊閒置的手段而已,利用率提高的話,指令消化速度當然就會變好。
__________________
工作主力機:
AMD Ryzen9 5900X 2203 B2
MSI B550M Mortar WiFi
Kingston Fury Beast RGB D4-3600 32GBx4 (Hynix AJR)
Samsung 970 EVO Plus 1TB
EVGA 850GM SFX
Thermalright SilverArrow IB-E Extreme
Mech. Master C28
BenQ PD3200Q
ASUS ROG Gladius II Origin
GANSS HS75T x Glorious Panda

護眼LCD的選擇
LG 32LM6200 32吋液晶電視電源模組維修經驗分享
舊 2018-10-18, 02:54 PM #16
回應時引用此文章
NEAL離線中