关于 CPU 的多核和超线程技术
1. 關(guān)于 CPU 的多核和超線程技術(shù)
CPU 的物理個數(shù)由主板上的插槽數(shù)量決定,每個 CPU 可以有多核心,每核心可能會有多線程。
多核 CPU 的每核(每核都是一個小芯片),在 OS 看來都是一個獨(dú)立的 CPU。
對于超線程 CPU 來說,每核 CPU 可以有多個線程(數(shù)量是兩個,比如1核雙線程,2核4線程,4核8線程),每個線程都是一個虛擬的邏輯 CPU (比如 Windows 下是以邏輯處理器的名稱稱呼的),而每個線程在 OS 看來也是獨(dú)立的 CPU。.
這是欺騙操作系統(tǒng)的行為,在物理上仍然只有 1 核,只不過在超線程 CPU 的角度上看,它認(rèn)為它的超線程會加速程序的運(yùn)行。
CPU 的多線程和程序的多線程是不同的,CPU 的多線程是硬件多線程,程序的多線程是軟件多線程,軟件多線程定義的是多個并發(fā)執(zhí)行的任務(wù)分支,硬件的多線程是可以被當(dāng)作一個 CPU 核心來調(diào)度執(zhí)行任務(wù)的 CPU 資源。
要發(fā)揮超線程優(yōu)勢,需要操作系統(tǒng)對超線程有專門的優(yōu)化。
超線程的 CPU 在能力上,比非多線程的 CPU 核心要更強(qiáng),但每個線程不足以與獨(dú)立的 CPU 核心能力相比較。
每核上的多線程 CPU 都共享該核的 CPU 資源。例如,假設(shè)每核 CPU 都只有一個”發(fā)動機(jī)”資源,那么線程 1 這個虛擬 CPU 使用了這個”發(fā)動機(jī)”后,線程 2 就沒法使用,只能等待。
所以,超線程技術(shù)的主要目的是為了增加流水線(參見前文對流水線的解釋)上更多個獨(dú)立的指令,這樣線程 1 和線程 2 在流水線上就盡量不會爭搶該核 CPU 資源。所以,超線程技術(shù)利用了 superscalar (超標(biāo)量)架構(gòu)的優(yōu)點(diǎn)。
多線程意味著每核可以有多個線程的狀態(tài)。比如某核的線程 1 空閑,線程 2 運(yùn)行。
超線程沒有提供完全意義上的并行處理,每核 CPU 在某一時刻仍然只能運(yùn)行一個進(jìn)程,因?yàn)榫€程 1 和線程 2 是共享某核 CPU 資源的。可以簡單的認(rèn)為每核 CPU 在獨(dú)立執(zhí)行進(jìn)程的能力上,有一個資源是唯一的,線程 1 獲取了該資源,線程 2 就沒法獲取。(稍后會深入解釋超線程如何實(shí)現(xiàn)并行運(yùn)行)
但是,線程 1 和線程 2 在很多方面上是可以并行執(zhí)行的。比如可以并行取指、并行解碼、并行執(zhí)行指令等。所以雖然單核在同一時間只能執(zhí)行一個進(jìn)程,但線程 1 和線程 2 可以互相幫助,加速進(jìn)程的執(zhí)行。
并且,如果線程 1 在某一時刻獲取了該核執(zhí)行進(jìn)程的能力,假設(shè)此刻該進(jìn)程發(fā)出了 IO 請求,于是線程 1 掌握的執(zhí)行進(jìn)程的能力,就可以被線程 2 獲取,即切換到線程 2 。這是在執(zhí)行線程間的切換,是非常輕量級的。(WIKI: if resources for one process are not available, then another process can continue if its resources are available)
多線程可能會出現(xiàn)一種現(xiàn)象:假如 2 核 4 線程 CPU,有兩個進(jìn)程要被調(diào)度,那么只有兩個線程會處于運(yùn)行狀態(tài),如果這兩個線程是在同一核上,則另一核完全空轉(zhuǎn),處于浪費(fèi)狀態(tài)。更期望的結(jié)果是每核上都有一個 CPU 分別調(diào)度這兩個進(jìn)程。
2. CPU多線程和程序多線程的關(guān)系和區(qū)別
程序的多線程,是軟件多線程;多個軟線程提供了多任務(wù)并發(fā)執(zhí)行的可能性。
CPU 里的線程數(shù)是超線程,是硬件多線程。每個硬件多線程(超線程)可以看作是邏輯 cpu,但并非是完全意義上的 CPU。
CPU 核心中的超線程共享該核心中的部分功能單元,比如超線程 1 執(zhí)行加法運(yùn)算時,超線程 2 可以執(zhí)行乘法運(yùn)算,但超線程 2 不能同時執(zhí)行加法運(yùn)算,只是舉個例子來說明,并非合理,不過也由此可知,超線程這種邏輯 CPU 是不能當(dāng)作一個完整核心的物理 CPU 來看待的。此外,由于每個超線程都是 CPU 資源,可以獨(dú)立運(yùn)行任務(wù),所以每個超線程都具有自己的執(zhí)行狀態(tài),比如要有自己的寄存器,有自己的 PC。
另一方面,超線程因?yàn)槎荚诤诵膬?nèi),它們共享該核心的 L1 和 L2 高速緩存,所以每個核心內(nèi)的 L1 和 L2 需要有專門的緩存控制器,需要有專門的緩存策略。
再回頭來說多進(jìn)程以及軟件多線程的調(diào)度問題。
無論是多進(jìn)程還是軟件多線程,它們所表示的含義都是可并發(fā)執(zhí)行的多個任務(wù)分支,如果是在多處理器、多核、或超線程 CPU 下,這些并發(fā)任務(wù)就可以被并行執(zhí)行,所以多進(jìn)程、軟件多線程都可以被調(diào)度分配到超線程上執(zhí)行,因?yàn)槌€程是可以獨(dú)立執(zhí)行任務(wù)的 CPU 資源。
3. 多顆CPU
對于多顆CPU的架構(gòu)組織方式,有:
- AMP(Asymmetric multiprocessing): 非對稱多處理器結(jié)構(gòu)
- SMP(Symmetric multiprocessing): 對稱多處理器結(jié)構(gòu)
- UMA(Uniform memory access): 一致存儲訪問結(jié)構(gòu)
- NUMA(Non-uniform memory access): 非一致存儲訪問結(jié)構(gòu)
- MPP(massively parallel processing): 大規(guī)模(海量)并行處理結(jié)構(gòu)
通常會拿來說明的是 SMP 和 NUMA,MPP 是海量并行處理結(jié)構(gòu)。
4. SMP
對稱多處理結(jié)構(gòu),認(rèn)為所有 CPU 的角色是平等的,所有 CPU 都共享內(nèi)存、總線等資源。其實(shí)單顆多核的 CPU 內(nèi)部的多核組織方式也是 SMP 結(jié)構(gòu),所有的核心都共享內(nèi)存、總線資源。
對于 SMP 結(jié)構(gòu)來說,由于每顆 CPU 都需要操作共享存儲:內(nèi)存,所以需要保證內(nèi)存數(shù)據(jù)的一致性(即緩存一致性)。比如 CPU1 里的 Core1 修改數(shù)據(jù) A,假如采用 bus snooping 緩存一致性策略,需要在總線發(fā)送廣播通知所有 CPU 的所有 Core 使它們對數(shù)據(jù) A 的緩存失效。如果 CPU 數(shù)量較少,問題并不大,但是隨著 CPU 數(shù)量增多,因緩存一致性和共享對象導(dǎo)致的總線流量會暴增。
所以 SMP 結(jié)構(gòu)并不利于擴(kuò)展更多 CPU ,比如 2-4 顆 CPU 可考慮 SMP 架構(gòu),但 4 顆 CPU 以上便不適合使用 SMP。
5. NUMA
NUMA(非一致存儲訪問結(jié)構(gòu))結(jié)構(gòu)使得各個 CPU 有自己的內(nèi)存資源,通過各 CPU 之間的互聯(lián)模塊,各 CPU 也可以訪問其它 CPU 的內(nèi)存資源。
因?yàn)?CPU 都有自己本地的內(nèi)存,可以各自管理自己的內(nèi)存保證自己的緩存一致性。但是,因?yàn)楦?CPU 各自的內(nèi)存分離開了,使得 CPU1 通過互聯(lián)模塊訪問 CPU2 的內(nèi)存速度很慢(因?yàn)橥ㄟ^中間數(shù)據(jù)傳輸介質(zhì)且距離更遠(yuǎn)),所以使用 NUMA 結(jié)構(gòu)時,程序應(yīng)盡量避免 CPU 之間的交互并行。
此外,CPU 數(shù)量越多,跨 CPU 訪問內(nèi)存的距離可能會越遠(yuǎn),速度會越差,所以 NUMA 結(jié)構(gòu)的性能并不能隨 CPU 數(shù)量的增加而線性增長。
下圖是 4 個 CPU 組成 NUMA 結(jié)構(gòu),總共 32 核,總共分配 32G 內(nèi)存,每顆 CPU 分配 8G 內(nèi)存作為自己的本地內(nèi)存。
#原文地址
原文地址: https://www.junmajinlong.com/os/multi_cpu/
總結(jié)
以上是生活随笔為你收集整理的关于 CPU 的多核和超线程技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 申请163电子邮箱,163邮箱格式是什么
- 下一篇: 2013中国高校SAS数据分析大赛完美落