電腦內(nèi)存實用基礎(chǔ)知識
內(nèi)存(Memory)也被稱為內(nèi)存儲器,其作用是用于暫時存放CPU中的運算數(shù)據(jù),以及與硬盤等外部存儲器交換的數(shù)據(jù)。計算機中所有程序的運行都是在內(nèi)存中進(jìn)行的,因此內(nèi)存的性能對計算機的影響非常大。下面就讓小編帶你去看看電腦內(nèi)存實用基礎(chǔ)知識,希望能幫助到大家!
你不知道的內(nèi)存知識
一、CPU與內(nèi)存
先鋪墊幾個概念,以免后面混亂:
Socket或Processor: 指一個物理CPU芯片,盒裝還是散裝的。上面有很多針腳,直接安裝在主板上。
Core : 指在Processor里封裝一個CPU核心,每個Core都是完全獨立的計算單元,我們平時說的4核心CPU,指的就是Processor里面封裝了4個Core。
HT超線程:目前Intel與AMD的Processor大多支持在一個Core里并行執(zhí)行兩個線程,此時從操作系統(tǒng)看就相當(dāng)于兩個邏輯CPU(Logical Processor)。大多數(shù)情況下,我們程序里提到的CPU概念就是指的這個Logical Processor。
咱們先來看幾個問題:
1、CPU可以直接操作內(nèi)存嗎?
可能一大部分老鐵肯定會說:肯定的啊,不能操作內(nèi)存怎么讀取數(shù)據(jù)呢。
其實如果我們用這聰明的大腦想一想,咱們的臺式主機大家肯定都玩過。上面CPU和內(nèi)存條是兩個完全獨立的硬件啊,而且CPU也沒有任何直接插槽用于掛載內(nèi)存條的。
也就是說,CPU和內(nèi)存條是物理隔離的,CPU并不能直接的訪問內(nèi)存條,而是需要借助主板上的其他硬件間接的來實現(xiàn)訪問。
2、CPU的運算速度和內(nèi)存條的訪問速度差距有多大?
呵呵呵,這么說吧,就是一個鴻溝啊,CPU的運算速度與內(nèi)存訪問速度之間的差距是100倍。
而由于CPU與內(nèi)存之間的速度差存在N個數(shù)量級的巨大鴻溝,于是CPU最親密的小伙伴Cache 閃亮登場了。與DRAM 家族的內(nèi)存(Memory)不同,Cache來自SRAM家族。
而DRAM與SRAM的最簡單區(qū)別就是后者特別快,容量特別小,電路結(jié)構(gòu)非常復(fù)雜,造價特別高。
而Cache與主內(nèi)存之間的巨大性能差距主要還是工作原理與結(jié)構(gòu)不同:
DRAM存儲一位數(shù)據(jù)只需要一個電容加一個晶體管,SRAM則需要6個晶體管。
由于DRAM的數(shù)據(jù)其實是被保存在電容里的,所以每次讀寫過程中的充放電環(huán)節(jié)也導(dǎo)致了DRAM讀寫數(shù)據(jù)有一個延時的問題,這個延時通常為十幾到幾十ns。
內(nèi)存可以被看作一個二維數(shù)組,每個存儲單元都有其行地址和列地址。
由于SRAM的容量很小,所以存儲單元的地址(行與列)比較短,可以被一次性傳輸?shù)絊RAM中。DRAM則需要分別傳送行與列的地址。
SRAM的頻率基本與CPU的頻率保持一致,而DRAM的頻率直到DDR4以后才開始接近CPU的頻率。
3、Cache 是怎么使用的?
其實Cache 是被集成到CPU內(nèi)部的一個存儲單元(平時也被我們稱為高速緩存),由于其造價昂貴,并且存儲容量遠(yuǎn)遠(yuǎn)不能滿足CPU大量、高速存取的需求。
所以出于對成本的控制,在現(xiàn)實中往往采用金字塔形的多級Cache體系來實現(xiàn)最佳緩存效果。
于是出現(xiàn)了,一級Cache(L1 Cache)、二級Cache(L2 Cache)及三級Cache(L3 Cache)。每一級都犧牲了部分性能指標(biāo)來換取更大的容量,目的也是存儲更多的熱點數(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)快一個數(shù)量級)
L3 Cache是被一個Socket上的所有CPU Core共享的,其實最早的L3 Cache被應(yīng)用在AMD發(fā)布的K6-III處理器上,當(dāng)時的L3 Cache受限于制造工藝,并沒有被集成到CPU內(nèi)部,而是被集成在主板上,如圖:
從上圖我們也能看出來,CPU如果要訪問內(nèi)存中的數(shù)據(jù),則需要經(jīng)過L1、L2、L3三道關(guān)卡,就是這三個Cache中都沒有需要的數(shù)據(jù),才會從主內(nèi)存中直接進(jìn)行讀取。
最后我們來看下Intel Sandy Bridge CPU的架構(gòu)圖:
二、多核CPU與內(nèi)存共享的問題
問題:Cache一致性問題
多核CPU共享內(nèi)存的問題也被稱為Cache一致性問題。
其實就是多個CPU核心看到的Cache數(shù)據(jù)應(yīng)該是一致的,在某個數(shù)據(jù)被某個CPU寫入自己的Cache(L1 Cache)以后,其他CPU都應(yīng)該能看到相同的Cache數(shù)據(jù)。
如果在自己的Cache中有舊數(shù)據(jù),則拋棄舊數(shù)據(jù)。
考慮到每個CPU都有自己內(nèi)部獨占的Cache,所以這個問題與分布式Cache保持同步的問題是同一類問題
目前業(yè)界公認(rèn)的解決一致性問題的最佳方案就是Intel 的MESI協(xié)議了,大多數(shù)SMP架構(gòu)都采用了這一方案。
解決方案:MESI
不知道大家還記得Cache Line 嗎,就是我們常說的高速緩存中緩存條目里面的那個緩存行。
其實仔細(xì)想想,在進(jìn)行I/O操作從來不以字節(jié)為單位,而是以塊為單位,有兩個原因:
I/O 操作比較慢,所以讀一個字節(jié)與讀連續(xù)N個字節(jié)的花費時間基本相同
數(shù)據(jù)訪問一般都具有空間連續(xù)的特征
所以CPU針對Memory的讀寫也采用了類似于I/O塊的方式
實際上,CPU Cache(高速緩存)里最小的存儲單元就是Cache line(緩存行),Intel CPU 的一個Cache Line存儲64個字節(jié)。
每一級Cache都被劃分為很多組Cache Line,典型的情況就是4條Cache Line為一組。
當(dāng)Cache從Memory中加載數(shù)據(jù)時,一次加載一條Cache Line的數(shù)據(jù)
如圖我們可以看到,每個Cache Line 頭部都有兩個Bit來標(biāo)識自身狀態(tài),總共四種:
M(Modified):修改狀態(tài),在其他CPU上沒有數(shù)據(jù)的副本,并且在本CPU上被修改過,與存儲器中的數(shù)據(jù)不一致,最終必然會引發(fā)系統(tǒng)總線的寫指令,將Cache Line中的數(shù)據(jù)寫回Memory中。
E(E__clusive):獨占狀態(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至少在其他某個CPU中有副本。
I(Invalid):無效狀態(tài),在當(dāng)前Cache Line中沒有有效數(shù)據(jù)或者該Cache Line數(shù)據(jù)已經(jīng)失效,不能再用;當(dāng)Cache要加載新數(shù)據(jù)時,優(yōu)先選擇此狀態(tài)的Cache Line,此外,Cache Line的初始狀態(tài)也是I狀態(tài)
在對Cache(高速緩存)的讀寫操作引發(fā)了Cache Line(緩存行)的狀態(tài)變化,因而可以將其理解為一種狀態(tài)機模型。
但MESI的復(fù)雜和獨特之處在于狀態(tài)有兩種視角:
一種是當(dāng)前讀寫操作(Local Read/Write)所在CPU看到的自身的Cache Line狀態(tài)及其他CPU上對應(yīng)的Cache Line狀態(tài)
另一種是一個CPU上的Cache Line狀態(tài)的變遷會導(dǎo)致其他CPU上對應(yīng)的Cache Line狀態(tài)變遷。
如下所示為MESI協(xié)議的狀態(tài)轉(zhuǎn)換圖:
具體MESI的實現(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都被連接到一個內(nèi)存總線上,它們平等訪問內(nèi)存,同時整個內(nèi)存是統(tǒng)一結(jié)構(gòu)、統(tǒng)一尋址的。
如下所示給出了SMP架構(gòu)的示意圖:
隨著CPU核心數(shù)量的不斷增加,SMP架構(gòu)也暴露出天生的短板,其根本瓶頸是共享內(nèi)存總線的帶寬無法滿足CPU數(shù)量的增加,同時,在一條“馬路”上通行的“車”多了,難免會陷入“擁堵模式”。
不知道你是否聽說過總線風(fēng)暴,可以看下:總線風(fēng)暴
在這種情況下,分布式解決方案應(yīng)運而生,系統(tǒng)的內(nèi)存與CPU進(jìn)行分割并捆綁在一起,形成多個獨立的子系統(tǒng),這些子系統(tǒng)之間高速互聯(lián),這就是NUMA(None Uniform Memory Architecture)架構(gòu),如下圖所示。
可以看出,NUMA架構(gòu)中的內(nèi)存被分割為獨立的幾塊,被不同CPU私有化了。
因此在CPU訪問自家內(nèi)存的時候會非??欤谠L問其他CPU控制的內(nèi)存數(shù)據(jù)時,則需要通過內(nèi)部互聯(lián)通道訪問。
NUMA架構(gòu)的優(yōu)點就是其伸縮性,就算擴(kuò)展到幾百個CPU也不會導(dǎo)致性嚴(yán)重的下降。
NUMA技術(shù)的特點
在NUMA架構(gòu)中引入了一個重要的新名詞——Node
一個Node由一個或者多個Socket Socket組成,即物理上的一個或多個CPU芯片組成一個邏輯上的Node
我們來看一個Dell PowerEdge系列服務(wù)器的NUMA的架構(gòu)圖:
從上圖可以看出其特點:
4個處理器形成4個獨立的NUMA Node由于每個Node都為8 Core,支持雙線程
每個Node里的Logic CPU數(shù)量都為16個,占每個Node分配系統(tǒng)總內(nèi)存的1/4
每個Node之間都通過Intel QPI(QuickPath Interconnect)技術(shù)形成了點到點的全互聯(lián)處理器系統(tǒng)
NUMA這種基于點到點的全互聯(lián)處理器系統(tǒng)與傳統(tǒng)的基于共享總線的處理器系統(tǒng)的SMP還是有巨大差異的。
在這種情況下無法通過嗅探總線的方式來實現(xiàn)Cache一致性,因此為了實現(xiàn)NUMA架構(gòu)下的Cache一致性,Intel引入了MESI協(xié)議的一個擴(kuò)展協(xié)議——MESIF
針對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)存從對應(yīng)的Node上分配,從而大大加快對象的創(chuàng)建過程
在大數(shù)據(jù)領(lǐng)域,NUMA系統(tǒng)正發(fā)揮著越來越強大的作用,SAP的高端大數(shù)據(jù)系統(tǒng)HANA被SGI在其UV NUMA Systems上實現(xiàn)了良好的水平擴(kuò)展
在云計算與虛擬化方面,OpenStack與VMware已經(jīng)支持基于NUMA技術(shù)的虛機分配能力,使得不同的虛機運行在不同的Core上,同時虛機的內(nèi)存不會跨越多個NUMA Node
內(nèi)存的一些簡單入門知識
首先是大家都知道的,也是百度百科的資料,內(nèi)存是什么?
內(nèi)存條是連接CPU 和其他設(shè)備的通道,起到緩沖和數(shù)據(jù)交換作用。 當(dāng)CPU在工作時,需要從硬盤等外部存儲器上讀取數(shù)據(jù),但由于硬盤這個“倉庫”太大,加上離CPU也很“遠(yuǎn)”,運輸“原料”數(shù)據(jù)的速度就比較慢,導(dǎo)致CPU的工作效率大打折扣!為了解決這個問題,人們便在CPU與外部存儲器之間,建了一個“小倉庫”——內(nèi)存。
內(nèi)存的特點是存儲速度快。內(nèi)存是電腦中的主要部件,它是相對于外存而言的。我們平常使用的程序,如QQ、瀏覽器、游戲,包括WINDOWS系統(tǒng),一般都是安裝在硬盤等外存上的,但僅此是不能使用其功能的,必須把它們調(diào)入內(nèi)存中運行,才能真正使用其功能,我們平時輸入一段文字,或玩一個游戲,其實都是在內(nèi)存中進(jìn)行的。就好比在一個書房里,存放書籍的書架或書柜相當(dāng)于電腦的外存,而我們工作的辦公室就是內(nèi)存。通常我們把要永久保存的、大量的數(shù)據(jù)存在外存上,當(dāng)然內(nèi)存的好壞會直接影響電腦的運行速度。
內(nèi)存的發(fā)展歷史
內(nèi)存分為DRAM和ROM兩種,前者又叫動態(tài)隨機存儲器,它的一個主要特征是斷電后數(shù)據(jù)會丟失,我們平時說的內(nèi)存就是指這一種;后者又叫只讀存儲器,我們平時開機首先啟動的是存于主板上ROM中的BIOS程序,然后再由它去調(diào)用硬盤中的Windows,ROM的一個主要特征是斷電后數(shù)據(jù)不會丟失。
而我們平時所說的“內(nèi)存條”則隸屬于DRAM類別下的SDRAM家族。
第一代 SDR SDRAM
第二代 DDR SDRAM
第三代 DDR2 SDRAM
第四代 DDR3 SDRAM
第五代DDR4 SDRAM
我們現(xiàn)在常用的DDR4就是第五代內(nèi)存了!
關(guān)于內(nèi)存頻率、時序還有電壓的一些解釋
所謂內(nèi)存頻率,就是我們經(jīng)常說的某某品牌,DDR4 2133、2400、2666…等等,后面這些數(shù)字就是內(nèi)存頻率。
一般情況下,內(nèi)存頻率的高低,決定了內(nèi)存性能的強弱。內(nèi)存頻率越高,內(nèi)存帶寬也就越高,正常工作的速度會更快。
關(guān)于內(nèi)存時序,也就是我們在CPU-Z里面所看到的數(shù)字了。
內(nèi)存時序是描述內(nèi)存條性能的一種參數(shù),一般存儲在內(nèi)存條的SPD中。這些參數(shù)設(shè)置的越小,內(nèi)存處理數(shù)據(jù)越快,但是也越不穩(wěn)定;反之較慢,但是穩(wěn)定性提高,因此需要設(shè)置合適的內(nèi)存時序。一般DDR4 2133的內(nèi)存默認(rèn)時序是15-15-15-35…
關(guān)于內(nèi)存電壓,每代內(nèi)存電壓都是有一個標(biāo)準(zhǔn)范圍的。比如我們現(xiàn)在用的DDR4內(nèi)存電壓默認(rèn)為1.2V,超頻也最好不要超過1.5V;而DDR3的內(nèi)存則是從1.5-2.0V;DDR2則是2V起步。
現(xiàn)在內(nèi)存所支持的__MP是什么?
Intel __MP全名是E__treme Memory Profile,是針對DDR3模塊而推出的一項認(rèn)證。
其主要功能就是高階的內(nèi)存設(shè)定,內(nèi)存廠商除了會在內(nèi)存預(yù)設(shè)普通的SPD值外,另外亦會寫入更為高速的設(shè)定。當(dāng)然,廠商們可以任意替旗下的內(nèi)存模塊寫進(jìn)更加高速的設(shè)定,但這樣就沒有任何穩(wěn)定性的保證及標(biāo)準(zhǔn),所以業(yè)界便引入__MP設(shè)計。
__MP會在內(nèi)存地址176-254中記錄內(nèi)存的速度,而最多可以保存2組的設(shè)定值。廠商們?nèi)缧枰玫絖_MP的認(rèn)證,就必須把內(nèi)存及該設(shè)定送交Intel測試,通過后就會給予認(rèn)證。Intel推出這個標(biāo)準(zhǔn),其主要用意是針對高效能市場,玩家使用具備了__MP的內(nèi)存,就能夠直接提升工作平臺的效能。
內(nèi)存時序和頻率的一些問題?
這時候我們就需要舉個例子了,以宇瞻黑豹DDR4 2400的內(nèi)存和影馳名人堂HOF DDR4 2400內(nèi)存來對比。
延遲對比:
宇瞻黑豹DDR4 2400 16-16-16-36 CL16 延遲計算 (1/2400MHz)__16=6.67納秒
宇瞻黑豹DDR4 2133 15-15-15-35 CL15 延遲計算 (1/2400MHz)__15=6.25納秒
然后計算帶寬(按照雙通道計算,內(nèi)存帶寬128bit):
2400 : 2400MHz__128bit/8= 38400MB/S
2133 : 2133MHz__128bit/8= 34128MB/S
內(nèi)存延遲意味著內(nèi)存的反應(yīng)速度。我們知道,CPU讀寫內(nèi)存的事情,首先是要告訴內(nèi)存,要讀寫某個地址的數(shù)據(jù),意味著CPU要先發(fā)送某個地址代碼給內(nèi)存,內(nèi)存接收到后,編譯準(zhǔn)備好的這段時間為內(nèi)存延遲時間。
當(dāng)內(nèi)存準(zhǔn)備好了數(shù)據(jù)反饋給CPU,CPU開始讀寫內(nèi)存,這時候,內(nèi)存的帶寬是主要作用,一直到數(shù)據(jù)傳輸完成,然后重復(fù)上一步操作,這就是內(nèi)存和CPU的工作原理(簡單通俗的講,實際比這個復(fù)雜多了)
所以我們可以分兩種情況,當(dāng)CPU讀寫內(nèi)存數(shù)據(jù)量很大,而且是連續(xù)的時候,內(nèi)存帶寬影響最大;當(dāng)CPU讀寫的內(nèi)存數(shù)據(jù)非常零碎,且零碎數(shù)據(jù)很多,這時候的低延遲的內(nèi)存速度回更快。
這也解釋了核顯對于雙通道高頻內(nèi)存的需求,圖形數(shù)據(jù)一般都是大量并且連續(xù)的,AMD的APU需要高頻雙內(nèi)存的原理,就是這么來的。
關(guān)于內(nèi)存超頻的一些問題
內(nèi)存超頻跟內(nèi)存顆粒的體制是肯定有最為直接的關(guān)系的。然后還有就是主板bios的設(shè)計、主板bios的優(yōu)化水平,CPU集成的內(nèi)存控制器等等原因,都是有影響的!
我們所看到某些支持__MP內(nèi)存和主板,在某種程度上,可以認(rèn)為是廠商預(yù)先保留的超頻選擇,直接在bios開啟即實現(xiàn)超頻。
當(dāng)然,我們普通的內(nèi)存一樣是可以超頻的,具體要看實際平臺和內(nèi)存等等來操作,基本原理也就是時序、頻率和電壓了,每個人的情況都不一樣,需要自己去調(diào)試才行。
又到了學(xué)點內(nèi)存知識的季節(jié)
什么是DDR?
DDR,全稱:DDR SDRAM ,Double Data Rate Synchronous Dynamic Random Access Memary,即,雙數(shù)據(jù)速率同步動態(tài)隨機存取記憶體,也就是我們常用的內(nèi)存,它從SDRAM的基礎(chǔ)上發(fā)展起來,以后依次出現(xiàn)了DDR SDRAM、DDR2 SDRAM、DDR3 SDRAM、DDR4 SDRAM。它們的能效不斷提升。文章結(jié)尾附一張純良心內(nèi)存能效參數(shù)表。
DDR間有什么區(qū)別?
1、SDRAM
SDRAM內(nèi)部組成如,可見其組成可以分為幾個部分,存儲陣列、IO門控單元、行列地址解碼器、行列地址鎖存器、邏輯控制單元(包含模式寄存器)、數(shù)據(jù)輸入輸出寄存器等。
存儲矩陣內(nèi)部結(jié)構(gòu),以8位內(nèi)存單元為例,每個內(nèi)存單元的數(shù)據(jù)輸出是并聯(lián)在一起,通過行列地址線選中一個存儲單元,
存儲容量大小和數(shù)據(jù)位寬度、行地址、列地址、塊數(shù)量等的關(guān)系:
單片容量(bit)=單片位寬×行數(shù)×列數(shù)×塊數(shù)量
2、DDR SDRAM
DDR的內(nèi)部結(jié)構(gòu)與SDRAM相比,數(shù)據(jù)讀寫部分改進(jìn)比較大。其一,使用了兩位預(yù)讀取的技術(shù);其二,增加了DLL(delay lock loop演示鎖定回路);其三,增加了數(shù)據(jù)掩碼控制和數(shù)據(jù)總線反轉(zhuǎn)控制;此外,時鐘信號和數(shù)據(jù)選通信號改為差分信號。
3、DDR2 SDRAM
DDR2 SDRAM整體布局變化不大,在輸入輸出數(shù)據(jù)總線接口上變化比較多。
DDR2在DDR的基礎(chǔ)上增加了ODT(on-die termination片上終結(jié),即通過內(nèi)部邏輯選擇合適的終端電阻進(jìn)行匹配)功能,預(yù)讀取提高到了4位,即每傳輸4個字節(jié)/字,只有第一個字節(jié)/字有潛伏期。
4、DDR3 SDRAM
DDR3 SDRAM在輸入輸出數(shù)據(jù)總線接口上繼續(xù)提升性能,在存儲結(jié)構(gòu)上改進(jìn)工藝,堆疊更多的存儲塊,提高單顆芯片的容量。
在功能上的改進(jìn)有,增加了讀寫平衡功能。
圖7 讀寫時序平衡關(guān)系
5、DDR4 SDRAM
DDR4 SDRAM在輸入輸出數(shù)據(jù)總線接口上繼續(xù)改善性能,在存儲結(jié)構(gòu)上繼續(xù)改進(jìn)工藝,不僅堆疊更多的存儲塊,而且使用硅片穿孔工藝把把堆疊成的存儲塊進(jìn)行并列放置,集中到一顆芯片中,提高單顆芯片的容量。
電腦內(nèi)存實用基礎(chǔ)知識相關(guān)文章: