計(jì)算機(jī)內(nèi)存基礎(chǔ)硬核知識(shí)
我們都知道,計(jì)算機(jī)是處理數(shù)據(jù)的設(shè)備,而數(shù)據(jù)的主要存儲(chǔ)位置就是磁盤和內(nèi)存,并且對(duì)于程序員來講,CPU 和內(nèi)存是我們必須了解的兩個(gè)物理結(jié)構(gòu),它是你通向高階程序員很重要的橋梁,下面就讓小編帶你去看看計(jì)算機(jī)內(nèi)存基礎(chǔ)硬核知識(shí),希望能幫助到大家!
電腦基礎(chǔ)知識(shí),新手入門最全電腦知識(shí)干貨
一、電腦軟硬件基礎(chǔ)知識(shí)
1、CPU型號(hào)怎么看?
CPU是一臺(tái)電腦的核心,而目前筆記本市場(chǎng)基本被Intel(英特爾)的CPU壟斷。而Intel的CPU型號(hào)命名還算比較有規(guī)律。
以i7-6920HQ為例:
四位數(shù)的頭一個(gè)數(shù)字是6指的是代際,也就是是英特爾第六代處理器。目前英特爾在市面上是4、5、6三代處理器并存。老于4代的處理器現(xiàn)在比較少見,一般也不推薦。
920是它的SKU值,可以理解為是一個(gè)編號(hào)。用來區(qū)分不同性能的CPU型號(hào)。
數(shù)字后面緊跟著的字母是H,代表的是處理器的功耗/性能類別。類似的有U(超低功耗15W)、M(僅出現(xiàn)在5代以前)、H(高性能35W/45W)。需要注意的是:功耗大不僅意味著更大的耗電量,也表示CPU的發(fā)熱量越大。進(jìn)而對(duì)筆記本的散熱系統(tǒng)有更高的要求。所以主打高性能的筆記本(比如游戲本),幾乎沒有輕薄、長續(xù)航的。
最后一個(gè)產(chǎn)品線后綴,有Q(四核處理器)、K(開放超頻)兩種情況。而雙核、不可超頻的處理器沒有這個(gè)后綴,也是最常見的。
什么?看完了還是不懂怎么選?簡單來說,如果你在乎功耗(省電)的話,代際越新越省電。比如6代比4代更省電。而在同一代中,U比H省電,而H又比HQ/HK省電。
2、關(guān)于電腦性能
如果你想了解性能的話,這就有些麻煩了。
諸如i7>i5>i3這樣的說法,基本不靠譜。因?yàn)檫@種說法僅僅在同一代處理器,同一功耗級(jí)別下才成立。如果跨代、跨系列地比較,就會(huì)出現(xiàn)諸如i5-6300HQ性能強(qiáng)于i7-6600U、i3-6100H和i7-4610Y性能差不多,這樣不太好理解的情況。所以光看型號(hào)判斷性能真的是不太靠譜。為了方便起見,我推薦一個(gè)方便(但并非完全嚴(yán)謹(jǐn))的方法給大家:查Passmark評(píng)分
關(guān)于DDR4內(nèi)存條選購的小知識(shí)
刻意追求內(nèi)存頻率意義不大,因?yàn)闆Q定內(nèi)存性能的重要指標(biāo)還有內(nèi)存時(shí)序(時(shí)序本身也可以體現(xiàn)出內(nèi)存顆粒的品質(zhì)如何)。市面上很多DDR4-2666內(nèi)存的報(bào)價(jià)甚至還低于當(dāng)前DDR4-2400,原因就是這些所謂的DDR4-2666內(nèi)存的時(shí)序普遍很難看(偏高/一般都是CL19),眾所周知,時(shí)序越高性能越差。目前主流內(nèi)存頻率為2400MHz~3200MHz,實(shí)際上2133也一樣能用,而且最便宜。
再有就是目前英特爾平臺(tái)只有Z系列、__系列芯片組可以使用超過2666/2933頻率的內(nèi)存,其他芯片組如B360/B365/B460無法突破這一限制,上高頻內(nèi)存會(huì)降頻運(yùn)行,具體限制情況請(qǐng)參照表格說明。用B360主板搭配3000MHz甚至3200MHz以上的高頻內(nèi)存意義不大,最終還是降頻到2400/2666運(yùn)行。B460主板搭配i7/i9處理器時(shí),可以考慮3000頻率的內(nèi)存。
AMD芯片組雖然基本都不會(huì)限制運(yùn)行頻率,都可以超頻支持高頻內(nèi)存,但是AMD處理器本身不爭氣,內(nèi)存兼容性問題比較普遍,搭配高頻內(nèi)存極易翻車。AMD的三代銳龍對(duì)高頻內(nèi)存支持的友好性大幅提升,這樣一來或許會(huì)帶動(dòng)3000~3600MHz區(qū)間高頻內(nèi)存的銷量大幅上漲。一代、二代銳龍(包括APU)建議搭配3000MHz以下的內(nèi)存。
從表格可以看出英特爾平臺(tái)主板除了Z系列的都是不支持超頻的,但是也要注意雖然主板支持最高頻率可能是2666、2933,但是也要看具體CPU支持的頻率。
AMD平臺(tái)理論上是沒有具體限制的,但是要看主板的內(nèi)存供電和CPU對(duì)內(nèi)存頻率的兼容;一代銳龍普遍兼容性比較差,一般上2666就可以了,供電比較好的主板可以上2933;二代銳龍兼容性有提升,一般上2933就可以了,供電比較好的主板可以上3200-3433,三代銳龍兼容性大大提升,市面上的正規(guī)內(nèi)存都是基本可以是用的,因?yàn)槿J龍內(nèi)存頻率影響cpu性能一般建議上3600頻率的就可以了,因?yàn)槌薩_399/TR__40平臺(tái)的其他三代銳龍內(nèi)存控制器它最高支持3600頻率,運(yùn)氣好的能達(dá)到3800,在往上面的頻率性能只會(huì)倒退。
從上面表格可以看出英特爾九代CPU及之前到6代買2666頻率的內(nèi)存條就可以了,這里為什么沒有說i3之前的只支持到2400,因?yàn)楝F(xiàn)在市面上的內(nèi)存條基本2400和2666價(jià)格差不多,很多都是同價(jià)格,所以上2666的就可以了,以后升級(jí)CPU了還能小小提升一下性能還不用換內(nèi)存條;
十代英特爾就比較坑了,i5之前都最高只支持到2666頻率的,所以裝機(jī)的如果不考慮以后升級(jí)cpu的就可以直接買2666的就可以了,如果考慮以后升級(jí)的可以直接買3000頻率的內(nèi)存條,i7、i9可以直接運(yùn)行在2933頻率上。
內(nèi)存容量
① 品牌方面,你自己信賴啥就選啥,不用考慮很多,內(nèi)存很難壞,品牌內(nèi)存均為終身質(zhì)保,一小部分牌子才會(huì)保修3~5年;
② 部分主板與部分內(nèi)存可能會(huì)有兼容性問題,遇到這類情況建議通過升級(jí)BIOS來進(jìn)行解決,或嘗試更換合適的內(nèi)存。
★ 4GB(2010~2014年流行):當(dāng)前來看只能滿足基本的上網(wǎng)、看視頻、聊天、入門游戲及輕度辦公需求;(都2020年了就不太推薦了)
★ 8GB(當(dāng)前主流):當(dāng)前可以滿足入門設(shè)計(jì)、多任務(wù)辦公、大型單機(jī)普通愛好者;
★ 16GB(當(dāng)前~未來5年主流):當(dāng)前可以滿足主流設(shè)計(jì)、渲染、大型單機(jī)愛好者;(只要是玩稍微大型一點(diǎn)的游戲都建議上16G內(nèi)存,8G__2形成雙通道,17年吃雞游戲大火,這游戲就很吃內(nèi)存)
★ 32GB或更高(2025~2030年):當(dāng)前主要是高預(yù)算或特殊高需求群體會(huì)安裝如此多的的內(nèi)存。(一小部分游戲也吃高內(nèi)存比如:逃離塔科夫,當(dāng)然最近3000系顯卡出了,高端用戶4K144hz運(yùn)行的話也建議上32G內(nèi)存,當(dāng)然一般買這配置的了一般都會(huì)上也不需要小編說(貧窮的小編))
常見問題
【Q】如何組雙通道內(nèi)存?組雙通道內(nèi)存有什么要求?
【A】組雙通道內(nèi)存只需接口相同,能同時(shí)被系統(tǒng)點(diǎn)亮識(shí)別即可,不用在意容量或者頻率。兩根不同頻率的內(nèi)存條是可以一起使用的,使用的過程中,高頻率的內(nèi)存條會(huì)自動(dòng)降頻到低頻的內(nèi)存條的頻率來使用的。參數(shù)不同的兩根(或4根)內(nèi)存組的雙通道叫做“彈性雙通道”。這里還需要注意,一般只有2根內(nèi)存插槽的主板組雙通道時(shí),只要插滿自然就是雙通道了,如果是4根插槽的板子,插兩根時(shí),必須插1、3位置或者2、4位置(也就是間隔一個(gè)空位/以靠近CPU的第一根插槽位為1)才可以組成雙通道,但一定是優(yōu)先插2、4位,其次才是1、3位。
__系列主板和TR系列主板是支持4通道的所以可以按照主板說明書插對(duì)應(yīng)內(nèi)存條以達(dá)到最大性能,避免性能浪費(fèi),比如你想買16G的內(nèi)存條就買8__2的形成雙通道,如果是四通道的話買4__4的,不過一般都是最低上32G的所以是8__4。
你不知道的內(nèi)存知識(shí)
一、CPU與內(nèi)存
先鋪墊幾個(gè)概念,以免后面混亂:
Socket或Processor: 指一個(gè)物理CPU芯片,盒裝還是散裝的。上面有很多針腳,直接安裝在主板上。
Core : 指在Processor里封裝一個(gè)CPU核心,每個(gè)Core都是完全獨(dú)立的計(jì)算單元,我們平時(shí)說的4核心CPU,指的就是Processor里面封裝了4個(gè)Core。
HT超線程:目前Intel與AMD的Processor大多支持在一個(gè)Core里并行執(zhí)行兩個(gè)線程,此時(shí)從操作系統(tǒng)看就相當(dāng)于兩個(gè)邏輯CPU(Logical Processor)。大多數(shù)情況下,我們程序里提到的CPU概念就是指的這個(gè)Logical Processor。
咱們先來看幾個(gè)問題:
1、CPU可以直接操作內(nèi)存嗎?
可能一大部分老鐵肯定會(huì)說:肯定的啊,不能操作內(nèi)存怎么讀取數(shù)據(jù)呢。
其實(shí)如果我們用這聰明的大腦想一想,咱們的臺(tái)式主機(jī)大家肯定都玩過。上面CPU和內(nèi)存條是兩個(gè)完全獨(dú)立的硬件啊,而且CPU也沒有任何直接插槽用于掛載內(nèi)存條的。
也就是說,CPU和內(nèi)存條是物理隔離的,CPU并不能直接的訪問內(nèi)存條,而是需要借助主板上的其他硬件間接的來實(shí)現(xiàn)訪問。
2、CPU的運(yùn)算速度和內(nèi)存條的訪問速度差距有多大?
呵呵呵,這么說吧,就是一個(gè)鴻溝啊,CPU的運(yùn)算速度與內(nèi)存訪問速度之間的差距是100倍。
而由于CPU與內(nèi)存之間的速度差存在N個(gè)數(shù)量級(jí)的巨大鴻溝,于是CPU最親密的小伙伴Cache 閃亮登場(chǎng)了。與DRAM 家族的內(nèi)存(Memory)不同,Cache來自SRAM家族。
而DRAM與SRAM的最簡單區(qū)別就是后者特別快,容量特別小,電路結(jié)構(gòu)非常復(fù)雜,造價(jià)特別高。
而Cache與主內(nèi)存之間的巨大性能差距主要還是工作原理與結(jié)構(gòu)不同:
DRAM存儲(chǔ)一位數(shù)據(jù)只需要一個(gè)電容加一個(gè)晶體管,SRAM則需要6個(gè)晶體管。
由于DRAM的數(shù)據(jù)其實(shí)是被保存在電容里的,所以每次讀寫過程中的充放電環(huán)節(jié)也導(dǎo)致了DRAM讀寫數(shù)據(jù)有一個(gè)延時(shí)的問題,這個(gè)延時(shí)通常為十幾到幾十ns。
內(nèi)存可以被看作一個(gè)二維數(shù)組,每個(gè)存儲(chǔ)單元都有其行地址和列地址。
由于SRAM的容量很小,所以存儲(chǔ)單元的地址(行與列)比較短,可以被一次性傳輸?shù)絊RAM中。DRAM則需要分別傳送行與列的地址。
SRAM的頻率基本與CPU的頻率保持一致,而DRAM的頻率直到DDR4以后才開始接近CPU的頻率。
3、Cache 是怎么使用的?
其實(shí)Cache 是被集成到CPU內(nèi)部的一個(gè)存儲(chǔ)單元(平時(shí)也被我們稱為高速緩存),由于其造價(jià)昂貴,并且存儲(chǔ)容量遠(yuǎn)遠(yuǎn)不能滿足CPU大量、高速存取的需求。
所以出于對(duì)成本的控制,在現(xiàn)實(shí)中往往采用金字塔形的多級(jí)Cache體系來實(shí)現(xiàn)最佳緩存效果。
于是出現(xiàn)了,一級(jí)Cache(L1 Cache)、二級(jí)Cache(L2 Cache)及三級(jí)Cache(L3 Cache)。每一級(jí)都犧牲了部分性能指標(biāo)來換取更大的容量,目的也是存儲(chǔ)更多的熱點(diǎn)數(shù)據(jù)。
以Intel家族Intel SandyBridge架構(gòu)的CPU為例:
L1 Cache容量為64KB,訪問速度為1ns左右
L2Cache容量擴(kuò)大4倍,達(dá)到256KB,訪問速度則降低到3ns左右
L3 Cache的容量則擴(kuò)大512倍,達(dá)到32MB,訪問速度也下降到12ns左右(也比訪問主存的105ns(40ns+65ns)快一個(gè)數(shù)量級(jí))
L3 Cache是被一個(gè)Socket上的所有CPU Core共享的,其實(shí)最早的L3 Cache被應(yīng)用在AMD發(fā)布的K6-III處理器上,當(dāng)時(shí)的L3 Cache受限于制造工藝,并沒有被集成到CPU內(nèi)部,而是被集成在主板上,如圖:
從上圖我們也能看出來,CPU如果要訪問內(nèi)存中的數(shù)據(jù),則需要經(jīng)過L1、L2、L3三道關(guān)卡,就是這三個(gè)Cache中都沒有需要的數(shù)據(jù),才會(huì)從主內(nèi)存中直接進(jìn)行讀取。
最后我們來看下Intel Sandy Bridge CPU的架構(gòu)圖:
二、多核CPU與內(nèi)存共享的問題
問題:Cache一致性問題
多核CPU共享內(nèi)存的問題也被稱為Cache一致性問題。
其實(shí)就是多個(gè)CPU核心看到的Cache數(shù)據(jù)應(yīng)該是一致的,在某個(gè)數(shù)據(jù)被某個(gè)CPU寫入自己的Cache(L1 Cache)以后,其他CPU都應(yīng)該能看到相同的Cache數(shù)據(jù)。
如果在自己的Cache中有舊數(shù)據(jù),則拋棄舊數(shù)據(jù)。
考慮到每個(gè)CPU都有自己內(nèi)部獨(dú)占的Cache,所以這個(gè)問題與分布式Cache保持同步的問題是同一類問題
目前業(yè)界公認(rèn)的解決一致性問題的最佳方案就是Intel 的MESI協(xié)議了,大多數(shù)SMP架構(gòu)都采用了這一方案。
解決方案:MESI
不知道大家還記得Cache Line 嗎,就是我們常說的高速緩存中緩存條目里面的那個(gè)緩存行。
其實(shí)仔細(xì)想想,在進(jìn)行I/O操作從來不以字節(jié)為單位,而是以塊為單位,有兩個(gè)原因:
I/O 操作比較慢,所以讀一個(gè)字節(jié)與讀連續(xù)N個(gè)字節(jié)的花費(fèi)時(shí)間基本相同
數(shù)據(jù)訪問一般都具有空間連續(xù)的特征
所以CPU針對(duì)Memory的讀寫也采用了類似于I/O塊的方式
實(shí)際上,CPU Cache(高速緩存)里最小的存儲(chǔ)單元就是Cache line(緩存行),Intel CPU 的一個(gè)Cache Line存儲(chǔ)64個(gè)字節(jié)。
每一級(jí)Cache都被劃分為很多組Cache Line,典型的情況就是4條Cache Line為一組。
當(dāng)Cache從Memory中加載數(shù)據(jù)時(shí),一次加載一條Cache Line的數(shù)據(jù)
如圖我們可以看到,每個(gè)Cache Line 頭部都有兩個(gè)Bit來標(biāo)識(shí)自身狀態(tài),總共四種:
M(Modified):修改狀態(tài),在其他CPU上沒有數(shù)據(jù)的副本,并且在本CPU上被修改過,與存儲(chǔ)器中的數(shù)據(jù)不一致,最終必然會(huì)引發(fā)系統(tǒng)總線的寫指令,將Cache Line中的數(shù)據(jù)寫回Memory中。
E(E__clusive):獨(dú)占狀態(tài),表示當(dāng)前Cache Line中的數(shù)據(jù)與Memory中的數(shù)據(jù)一致,此外,在其他CPU上沒有數(shù)據(jù)的副本。
S(Shared):共享狀態(tài),表示Cache Line中的數(shù)據(jù)與Memory中的數(shù)據(jù)一致,而且當(dāng)前CPU至少在其他某個(gè)CPU中有副本。
I(Invalid):無效狀態(tài),在當(dāng)前Cache Line中沒有有效數(shù)據(jù)或者該Cache Line數(shù)據(jù)已經(jīng)失效,不能再用;當(dāng)Cache要加載新數(shù)據(jù)時(shí),優(yōu)先選擇此狀態(tài)的Cache Line,此外,Cache Line的初始狀態(tài)也是I狀態(tài)
在對(duì)Cache(高速緩存)的讀寫操作引發(fā)了Cache Line(緩存行)的狀態(tài)變化,因而可以將其理解為一種狀態(tài)機(jī)模型。
但MESI的復(fù)雜和獨(dú)特之處在于狀態(tài)有兩種視角:
一種是當(dāng)前讀寫操作(Local Read/Write)所在CPU看到的自身的Cache Line狀態(tài)及其他CPU上對(duì)應(yīng)的Cache Line狀態(tài)
另一種是一個(gè)CPU上的Cache Line狀態(tài)的變遷會(huì)導(dǎo)致其他CPU上對(duì)應(yīng)的Cache Line狀態(tài)變遷。
如下所示為MESI協(xié)議的狀態(tài)轉(zhuǎn)換圖:
具體MESI的實(shí)現(xiàn)過程可以看我另一篇文章:看懂這篇,才能說了解并發(fā)底層技術(shù)
深入理解不一致性內(nèi)存
MESI協(xié)議解決了多核CPU下的Cache一致性問題,因而成為SMP架構(gòu)的唯一選擇,而SMP架構(gòu)近幾年迅速在PC領(lǐng)域(__86)發(fā)展。
SMP架構(gòu)是一種平行的架構(gòu),所有CPU Core都被連接到一個(gè)內(nèi)存總線上,它們平等訪問內(nèi)存,同時(shí)整個(gè)內(nèi)存是統(tǒng)一結(jié)構(gòu)、統(tǒng)一尋址的。
如下所示給出了SMP架構(gòu)的示意圖:
隨著CPU核心數(shù)量的不斷增加,SMP架構(gòu)也暴露出天生的短板,其根本瓶頸是共享內(nèi)存總線的帶寬無法滿足CPU數(shù)量的增加,同時(shí),在一條“馬路”上通行的“車”多了,難免會(huì)陷入“擁堵模式”。
不知道你是否聽說過總線風(fēng)暴,可以看下:總線風(fēng)暴
在這種情況下,分布式解決方案應(yīng)運(yùn)而生,系統(tǒng)的內(nèi)存與CPU進(jìn)行分割并捆綁在一起,形成多個(gè)獨(dú)立的子系統(tǒng),這些子系統(tǒng)之間高速互聯(lián),這就是NUMA(None Uniform Memory Architecture)架構(gòu),如下圖所示。
可以看出,NUMA架構(gòu)中的內(nèi)存被分割為獨(dú)立的幾塊,被不同CPU私有化了。
因此在CPU訪問自家內(nèi)存的時(shí)候會(huì)非常快,在訪問其他CPU控制的內(nèi)存數(shù)據(jù)時(shí),則需要通過內(nèi)部互聯(lián)通道訪問。
NUMA架構(gòu)的優(yōu)點(diǎn)就是其伸縮性,就算擴(kuò)展到幾百個(gè)CPU也不會(huì)導(dǎo)致性嚴(yán)重的下降。
NUMA技術(shù)的特點(diǎn)
在NUMA架構(gòu)中引入了一個(gè)重要的新名詞——Node
一個(gè)Node由一個(gè)或者多個(gè)Socket Socket組成,即物理上的一個(gè)或多個(gè)CPU芯片組成一個(gè)邏輯上的Node
我們來看一個(gè)Dell PowerEdge系列服務(wù)器的NUMA的架構(gòu)圖:
從上圖可以看出其特點(diǎn):
4個(gè)處理器形成4個(gè)獨(dú)立的NUMA Node由于每個(gè)Node都為8 Core,支持雙線程
每個(gè)Node里的Logic CPU數(shù)量都為16個(gè),占每個(gè)Node分配系統(tǒng)總內(nèi)存的1/4
每個(gè)Node之間都通過Intel QPI(QuickPath Interconnect)技術(shù)形成了點(diǎn)到點(diǎn)的全互聯(lián)處理器系統(tǒng)
NUMA這種基于點(diǎn)到點(diǎn)的全互聯(lián)處理器系統(tǒng)與傳統(tǒng)的基于共享總線的處理器系統(tǒng)的SMP還是有巨大差異的。
在這種情況下無法通過嗅探總線的方式來實(shí)現(xiàn)Cache一致性,因此為了實(shí)現(xiàn)NUMA架構(gòu)下的Cache一致性,Intel引入了MESI協(xié)議的一個(gè)擴(kuò)展協(xié)議——MESIF
針對(duì)NUMA的支持
NUMA架構(gòu)打破了傳統(tǒng)的“全局內(nèi)存”概念,目前還沒有任意一種編程語言從內(nèi)存模型上支持它,當(dāng)前也很難開發(fā)適應(yīng)NUMA的軟件。
Java在支持NUMA的系統(tǒng)里,可以開啟基于NUMA的內(nèi)存分配方案,使得當(dāng)前線程所需的內(nèi)存從對(duì)應(yīng)的Node上分配,從而大大加快對(duì)象的創(chuàng)建過程
在大數(shù)據(jù)領(lǐng)域,NUMA系統(tǒng)正發(fā)揮著越來越強(qiáng)大的作用,SAP的高端大數(shù)據(jù)系統(tǒng)HANA被SGI在其UV NUMA Systems上實(shí)現(xiàn)了良好的水平擴(kuò)展
在云計(jì)算與虛擬化方面,OpenStack與VMware已經(jīng)支持基于NUMA技術(shù)的虛機(jī)分配能力,使得不同的虛機(jī)運(yùn)行在不同的Core上,同時(shí)虛機(jī)的內(nèi)存不會(huì)跨越多個(gè)NUMA Node