對超線程幾個不一樣角度的解釋

角度1:舉個栗子

假設我是一個CPU,我如今須要process(吃)一些食物,我如今只有一張嘴。linux

假如我有多張嘴,確定就能夠process更多的食物。這就是multi-core processor所要想要完成的任務。可是因爲某些緣由及限制,有時候沒法實現這種方式。程序員

我只有一張嘴,我能夠用手抓一片食物,送到嘴邊,而後在嘴busy的時候,抓起下一片食物,繼續送到嘴邊。若是出現這種狀況:當個人嘴已經吃完那一片食物了,這個時候手尚未將食物送到嘴邊,這時候個人嘴就處於空閒狀態。假如我有兩隻手,即便個人嘴並不能吃得更快,但個人嘴也不須要浪費任什麼時候間,能夠一直處於busy的狀態。這就是hype-threading(超線程),一個processor,而後加上很智能的調度系統,使得processor能夠一直處於busy的狀態。api

超線程對單線程的任務,也就是後面一部分任務必須依賴於前面一部分任務,並無太大做用。 緩存

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

與之相反的,吃不少糖果。吃紅色的糖和吃藍色的糖之間,是沒有任何前後關係的。若是如今我有多張手、多張嘴,確定是能夠更多吃完這糖果的。

在現實生活中,受益於超線程和多核處理器的常見任務有:多線程

  • 編輯視頻
  • 3D渲染
  • 繁重的多線程任務

好比編輯視頻,視頻是一幀一幀的,徹底能夠在編輯這一幀的時候同時編輯另一幀。性能

總結一下:超線程的目的,就是使得processor busy,充分利用CPU資源。因此,超線程並無他名字聽上去那麼神奇,fetch

角度2:超線程之於CPU的意義

首先須要理清楚CPU核core的關係: 操作系統

上面這張圖一圖勝千言,CPU(processor)是一個物理上的小盒子,裏面在物理上又分爲多個core,每一個core在功能上市獨立的,能夠獨立運行本身的線程。不一樣的core之間共享一個3級緩存、共享common bus。相比多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了。

在操做系統眼裏,如今CPU有4個核,她能夠把工做分攤給這4個(虛擬的)核。每一個core均可以獨立地執行指令。 總結一下:超線程就是提升虛擬核的一種手段,減小了CPU處於空閒狀態的時間。

角度3:超線程是如何實現的

咱們仍是從最開始、最簡單的提及。

首先是單核CPU,樹莓派使用的就是單核CPU,可是樹莓派依然能夠運行多任務的linux系統。爲何呢?實際上在底層,操做系統在不停地切換不一樣的任務,速度之快到讓你以爲他們是真的同時運行的。

而後是多核CPU,如上所說的,不一樣的core之間在邏輯上是獨立的,他們會共享一些資源。操做系統就能夠給不一樣的core分發不一樣的任務,若是你要運行一個多線程的任務,你擁有的core越多,速度就會越快。

再而後就是超線程了。要在一個core上面實現兩個線程,那麼這個core該怎麼設計呢?

把一個core的前半部分複製一下,而後合在一塊兒,再和後半部分拼接一下,這種狀況下,咱們就有了一個能夠同時執行兩個線程的FRONTEND,或者以一個程序員更容易理解的角度來講,有了一個能夠執行雙線程的api接口,對於操做系統來講,他能夠"調用"這個接口,同時分兩個任務給這個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線程的性能還要相對好一點。

關注個人微信公衆號

相關文章
相關標籤/搜索