角度1:舉個栗子
假設我是一個CPU,我現在需要process(吃)一些食物,我現在只有一張嘴。
假如我有多張嘴,肯定就可以process更多的食物。這就是multi-core processor所要想要完成的任務。但是由於某些原因及限制,有時候無法實現這種方式。
我只有一張嘴,我可以用手抓一片食物,送到嘴邊,然後在嘴busy的時候,抓起下一片食物,繼續送到嘴邊。如果出現這種情況:當我的嘴已經吃完那一片食物了,這個時候手還沒有將食物送到嘴邊,這時候我的嘴就處於空閒狀態。假如我有兩隻手,即使我的嘴並不能吃得更快,但我的嘴也不需要浪費任何時間,可以一直處於busy的狀態。這就是hype-threading(超執行緒),一個processor,然後加上很智慧的排程系統,使得processor可以一直處於busy的狀態。
超執行緒對單執行緒的任務,也就是後面一部分任務必須依賴於前面一部分任務,並沒有太大作用。

比如你要吃一個兩勺冰淇淋錐,你必須先吃掉上面的部分,然後才能吃下面的部分。在這種情況下,增加更多的嘴或者手,都是沒有什麼意義的。

在現實生活中,受益於超執行緒和多核處理器的常見任務有:
- 編輯視訊
- 3D渲染
- 繁重的多執行緒任務
比如編輯視訊,視訊是一幀一幀的,完全可以在編輯這一幀的時候同時編輯另外一幀。
總結一下:超執行緒的目的,就是使得processor busy,充分利用CPU資源。所以,超執行緒並沒有他名字聽上去那麼神奇,
角度2:超執行緒之於CPU的意義
首先需要理清楚CPU核core的關係:

超執行緒是intel開發的,已經有10多年的歷史了,它可以在同一時刻,執行兩個執行緒,從而提高了單個CPU core的效率。如下圖所示:

來簡略看一下CPU的發展階段: 剛開始,一個CPU只有一個core,一個CPU只能同時執行一個執行緒:

接著,CPU設計師開始往一個CPU裡面新增更多的core,現在一個CPU就可以同時執行多個執行緒了:

為了進一步提高CPU的效能,Intel又發明了超執行緒。超執行緒把一個物理的core,在邏輯上分成了兩個虛擬核(two virtual cores)。現在,在作業系統的眼裡,這個2核CPU實際上就是一個4核CPU了。

角度3:超執行緒是如何實現的
我們還是從最開始、最簡單的說起。
首先是單核CPU,樹莓派使用的就是單核CPU,但是樹莓派依然可以執行多工的linux系統。為什麼呢?實際上在底層,作業系統在不停地切換不同的任務,速度之快到讓你覺得他們是真的同時執行的。
然後是多核CPU,如上所說的,不同的core之間在邏輯上是獨立的,他們會共享一些資源。作業系統就可以給不同的core分發不同的任務,如果你要執行一個多執行緒的任務,你擁有的core越多,速度就會越快。
再然後就是超執行緒了。要在一個core上面實現兩個執行緒,那麼這個core該怎麼設計呢?

把這種core組合一下,就成了多核CPU,且每個CPU都支援超執行緒技術。

接著再來看一個現實生活中的栗子:地鐵過安檢。

- 對面那隊是空的,這種情況下我這一對可以很快通過。
- 對面那隊阻塞了,這對我這一隊沒有影響,我們可以不受影響地通過。
- 兩隊都是正常的,這個時候在安檢員那兒,就會產生競爭核堵塞。
把隊伍換成前面說的兩個FRONTEND介面,把安檢員當作是core,每個介面都能獨立得fetch指令,然後把指令傳遞給core。core在真正執行指令的時候,是會產生競爭的,**所以在效能上來說,一個有超執行緒能力的單核CPU,是無法和一個雙核CPU相比的。**只有當其中一個queue阻塞的時候,才能得到雙倍的效能。一般而言,有超執行緒的核,效能上是沒有超執行緒的核的1.25倍。
那麼我們來做一個計算題:一個6核12執行緒的CPU,和一個8核8執行緒的CPU,哪一個綜合效能要好一點?
- 6核12執行緒,也就是6個有超執行緒能力的物理核,實際上可以相等於6 * 1.25 = 7.5個核
- 8核8執行緒,就是8個核
所以,8核8執行緒的效能還要相對好一點。
關注我的微信公眾號
