內(nèi)存條的基礎(chǔ)知識(shí)
接口類(lèi)型,是根據(jù)內(nèi)存條金手指上導(dǎo)電觸片的數(shù)量來(lái)劃分的。金手指上的導(dǎo)電觸片,也習(xí)慣稱(chēng)為針腳數(shù)(Pin)。因?yàn)椴煌膬?nèi)存采用的接口類(lèi)型各不相同,而每種接口類(lèi)型所采用的針腳數(shù)各不相同。下面就讓小編帶你去看看關(guān)于內(nèi)存條的基礎(chǔ)知識(shí)吧,希望能幫助到大家!
內(nèi)存知識(shí)詳解:接口類(lèi)型
1、金手指
金手指(connecting finger)是內(nèi)存條上與內(nèi)存插槽之間的連接部件,所有的信號(hào)都是通過(guò)金手指進(jìn)行傳送的。金手指由眾多金黃色的導(dǎo)電觸片組成,因其表面鍍金而且導(dǎo)電觸片排列如手指狀,所以稱(chēng)為“金手指”。金手指實(shí)際上是在覆銅板上通過(guò)特殊工藝再覆上一層金,因?yàn)榻鸬目寡趸詷O強(qiáng),而且傳導(dǎo)性也很強(qiáng)。不過(guò),因?yàn)榻鸢嘿F的價(jià)格,目前較多的內(nèi)存都采用鍍錫來(lái)代替。從上個(gè)世紀(jì) 90 年代開(kāi)始,錫材料就開(kāi)始普及,目前主板、內(nèi)存和顯卡等設(shè)備的“金手指”,幾乎都是采用的錫材料,只有部分高性能服務(wù)器/工作站的配件接觸點(diǎn),才會(huì)繼續(xù)采用鍍金的做法,價(jià)格自然不菲。
內(nèi)存的金手指
內(nèi)存處理單元的所有數(shù)據(jù)流、電子流,正是通過(guò)金手指與內(nèi)存插槽的接觸與 PC 系統(tǒng)進(jìn)行交換,是內(nèi)存的輸出輸入端口。因此,其制作工藝,對(duì)于內(nèi)存連接顯得相當(dāng)重要。
2、內(nèi)存插槽
最初的計(jì)算機(jī)系統(tǒng),通過(guò)單獨(dú)的芯片安裝內(nèi)存,那時(shí)內(nèi)存芯片都采用 DIP(Dual ln-line Package,雙列直插式封裝)封裝,DIP 芯片是通過(guò)安裝在插在總線插槽里的內(nèi)存卡與系統(tǒng)連接,此時(shí)還沒(méi)有正式的內(nèi)存插槽。DIP 芯片有個(gè)最大的問(wèn)題,就在于安裝起來(lái)很麻煩,而且隨著時(shí)間的增加,由于系統(tǒng)溫度的反復(fù)變化,它會(huì)逐漸從插槽里偏移出來(lái)。隨著每日頻繁的計(jì)算機(jī)啟動(dòng)和關(guān)閉,芯片不斷被加熱和冷卻,慢慢地芯片會(huì)偏離出插槽。最終導(dǎo)致接觸不好,產(chǎn)生內(nèi)存錯(cuò)誤。
內(nèi)存插槽
早期還有另外一種方法,是把內(nèi)存芯片直接焊接在主板或擴(kuò)展卡里,這樣有效避免了 DIP 芯片偏離的問(wèn)題,但無(wú)法再對(duì)內(nèi)存容量進(jìn)行擴(kuò)展,而且如果一個(gè)芯片發(fā)生損壞,整個(gè)系統(tǒng)都將不能使用,只能重新焊接一個(gè)芯片或更換包含壞芯片的主板。此種方法付出的代價(jià)較大,也極為不便。
對(duì)于內(nèi)存存儲(chǔ)器,大多數(shù)現(xiàn)代的系統(tǒng),都已采用單列直插內(nèi)存模塊(Single Inline Memory Module,SIMM)或雙列直插內(nèi)存模塊(Dual Inline Memory Module,DIMM)來(lái)替代單個(gè)內(nèi)存芯片。這些小板卡插入到主板或內(nèi)存卡上的特殊連接器里。
3、內(nèi)存模塊
1) SIMM
SIMM(Single Inline Memory Module,單列直插內(nèi)存模塊)。內(nèi)存條通過(guò)金手指與主板連接,內(nèi)存條正反兩面都帶有金手指。金手指可以在兩面提供不同的信號(hào),也可以提供相同的信號(hào)。SIMM 就是一種兩側(cè)金手指都提供相同信號(hào)的內(nèi)存結(jié)構(gòu),它多用于早期的 FPM 和 EDD DRAM,最初一次只能傳輸 8bif 數(shù)據(jù),后來(lái)逐漸發(fā)展出 16bit、32bit 的 SIMM 模組。其中,8bit 和 16bit SIMM 使用 30pin 接口,32bit 的則使用72pin 接口。在內(nèi)存發(fā)展進(jìn)入 SDRAM 時(shí)代后,SIMM 逐漸被 DIMM 技術(shù)取代。
2) DIMM
DIMM(Dual Inline Memory Module,雙列直插內(nèi)存模塊)。與 SIMM 相當(dāng)類(lèi)似,不同的只是 DIMM 的金手指兩端,不像 SIMM 那樣是互通的,它們各自獨(dú)立傳輸信號(hào)。因此,可以滿足更多數(shù)據(jù)信號(hào)的傳送需要。同樣采用 DIMM,SDRAM 的接口與 DDR 內(nèi)存的接口也略有不同,SDRAMDIMM 為 168Pin DIMM 結(jié)構(gòu),金手指每面為 84Pin,金手指上有兩個(gè)卡口,用來(lái)避免插入插槽時(shí),錯(cuò)誤將內(nèi)存反向插入而導(dǎo)致燒毀;
DDR DIMM則采用 184Pin DIMM 結(jié)構(gòu),金手指每面有 92Pin,金手指上只有一個(gè)卡口??跀?shù)量的不同,是二者最為明顯的區(qū)別。DDR2 DIMM 為240pinDIMM 結(jié)構(gòu),金手指每面有 120Pin,與 DDR DIMM 一樣金手指一樣,也只有一個(gè)卡口,但是卡口的位置與 DDR DIMM 稍微有一些不同。因此,DDR 內(nèi)存是插不進(jìn) DDR2 DIMM 的,同理 DDR2 內(nèi)存也是插不進(jìn) DDR DIMM 的。因此,在一些同時(shí)具有 DDR DIMM 和 DDR2 DIMM 的主板上,不會(huì)出現(xiàn)將內(nèi)存插錯(cuò)插槽的問(wèn)題。
不同針腳 DIMM 接口對(duì)比。為了滿足筆記本電腦對(duì)內(nèi)存尺寸的要求,SO-DIMM(Small Outline DIMM Module)也開(kāi)發(fā)了出來(lái),它的尺寸比標(biāo)準(zhǔn)的 DIMM 要小很多,而且引腳數(shù)也不相同。同樣 SO-DIMM 也根據(jù) SDRAM 和 DDR 內(nèi)存規(guī)格不同而不同。SDRAM 的 SO-DIMM 只有 144pin引腳,而DDR 的 SO-DIMM 擁有 200pin 引腳。此外,筆記本內(nèi)存還有 MicroDIMM 和 Mini Registered DIMM 兩種接口。MicroDIMM 接口的DDR 為 172pin,DDR2 為 214pin;Mini Registered DIMM 接口為 244pin,主要用于 DDR2 內(nèi)存。
3) RIMM
RIMM(Rambus Inline Memory Module)是 Rambus 公司生產(chǎn)的 RDRAM 內(nèi)存所采用的接口類(lèi)型。RIMM 內(nèi)存與 DIMM 的外型尺寸差不多,金手指同樣也是雙面的。RIMM 有也 184 Pin 的針腳,在金手指的中間部分有兩個(gè)靠的很近的卡口。RIMM 非 ECC 版有 16 位數(shù)據(jù)寬度,ECC 版則都是 18 位寬。由于 RDRAM 內(nèi)存較高的價(jià)格,此類(lèi)內(nèi)存在 DIY 市場(chǎng)很少見(jiàn)到,RIMM 接口也就難得一見(jiàn)了。
基礎(chǔ)知識(shí)(入門(mén)篇)
關(guān)于01
我們初學(xué)編程時(shí),只知道編寫(xiě)代碼,運(yùn)行程序,卻不知道程序是在什么的基礎(chǔ)上運(yùn)行的。只知道聲明變量,給變量賦值,數(shù)據(jù)存儲(chǔ)在變量中,卻不知道變量是以什么形式存在。
《內(nèi)存》可以參考《計(jì)算機(jī)組成原理》和《微機(jī)原理》書(shū)籍,而作為信息學(xué)奧賽的同學(xué)們,只需了解《內(nèi)存》的一些基礎(chǔ)知識(shí)即可,不必深究。
關(guān)于《計(jì)算機(jī)組成原理》,可參考文章:
【計(jì)算機(jī)組成原理】(入門(mén)篇)
目錄02
1、內(nèi)存的內(nèi)部結(jié)構(gòu)
2、數(shù)據(jù)是如何存儲(chǔ)在內(nèi)存中
3、數(shù)據(jù)在內(nèi)存中的表現(xiàn)形式
4、存儲(chǔ)單元的大小
5、如何從內(nèi)存中尋找指定的數(shù)據(jù)(內(nèi)存地址)
概要03
本篇主要講解有關(guān)《內(nèi)存》的基礎(chǔ)知識(shí),有助于自己在編程上的進(jìn)一步提升。
為什么學(xué)習(xí)《內(nèi)存》的知識(shí)可以提升自己對(duì)編程進(jìn)一步的認(rèn)識(shí)呢?
其實(shí),我們學(xué)習(xí)信奧(C/C++)時(shí),一般只是學(xué)習(xí)C/C++的相關(guān)語(yǔ)法。當(dāng)我們練習(xí)多了,可以熟練地運(yùn)用各種語(yǔ)法。我們也知道如何將1+1賦給一個(gè)int類(lèi)型變量,也知道不能把整數(shù)1賦給string類(lèi)型變量(對(duì)象)。但是1+1賦值操作在內(nèi)存中是如何實(shí)現(xiàn)的呢?為什么浮點(diǎn)型存在誤差?為什么int類(lèi)型與string類(lèi)型不能直接賦值操作?
我們只知道編寫(xiě)的程序在內(nèi)存中運(yùn)行,卻不知道數(shù)據(jù)在內(nèi)存中是如何存儲(chǔ)的。就好比只看到書(shū)籍的封面,但不知道書(shū)中的內(nèi)容。
要求04
在學(xué)習(xí)《內(nèi)存》之前,我們只需掌握C/C++一些基礎(chǔ)知識(shí),可以獨(dú)立解決一些簡(jiǎn)單的問(wèn)題即可。
內(nèi)存的內(nèi)部結(jié)構(gòu)
對(duì)于信息學(xué)奧賽的同學(xué)們來(lái)說(shuō),《內(nèi)存》這一概念比較抽象。不過(guò),經(jīng)過(guò)閱讀文章《【計(jì)算機(jī)組成原理】(入門(mén)篇)》后,相信同學(xué)們對(duì)內(nèi)存的概念清晰了不少,至少知道內(nèi)存是用來(lái)存儲(chǔ)程序運(yùn)行的相關(guān)數(shù)據(jù)。
常用數(shù)據(jù)一般存儲(chǔ)在硬盤(pán)中,如果對(duì)這些數(shù)據(jù)進(jìn)行處理(例如使用Word寫(xiě)一篇文章),并不是CPU直接對(duì)硬盤(pán)的文件進(jìn)行操作,而是從硬盤(pán)相對(duì)應(yīng)的位置把該文件的數(shù)據(jù)讀取到內(nèi)存中,CPU再對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行處理。簡(jiǎn)單地說(shuō),《內(nèi)存》是CPU與硬盤(pán)進(jìn)行溝通的“橋梁”。當(dāng)然,并不一定是硬盤(pán),平時(shí)存儲(chǔ)數(shù)據(jù)的設(shè)備還有U盤(pán)等,統(tǒng)稱(chēng)為外存。
《內(nèi)存》內(nèi)部由數(shù)以億計(jì)的納米級(jí)電子元件構(gòu)成。
如上圖,內(nèi)存條由存儲(chǔ)芯片、金手指、電路組成。
存儲(chǔ)芯片:黑色的方塊。每個(gè)方塊由很多的晶體管組成,可以理解為數(shù)據(jù)就存儲(chǔ)在晶體管中。
金手指:底部的金色金屬片。內(nèi)存條插在主板的內(nèi)存條插槽中,實(shí)際上與插槽接觸的部位就是金手指。如此一來(lái),CPU就可以通過(guò)主板與內(nèi)存進(jìn)行通信。
電路:綠色面板。面板中有許多細(xì)微的線路和電阻等電子元件,用于數(shù)據(jù)的傳輸。
數(shù)據(jù)是如何存儲(chǔ)在內(nèi)存中
家里控制電燈的開(kāi)關(guān),電腦的開(kāi)關(guān)。存儲(chǔ)芯片中的晶體管也是如此。程序運(yùn)行的數(shù)據(jù)存儲(chǔ)在晶體管中。
如上圖,每個(gè)方格代表一個(gè)晶體管。
如下圖,每個(gè)晶體管都有獨(dú)立的開(kāi)關(guān),通電時(shí)開(kāi),斷電時(shí)關(guān)。此處用白色表示開(kāi),黑色表示關(guān)。
一個(gè)數(shù)值并不是只存儲(chǔ)在一個(gè)晶體管中,是多個(gè)晶體管。而多個(gè)晶體管構(gòu)成一個(gè)存儲(chǔ)單元。
存儲(chǔ)單元的大小
存儲(chǔ)單元有大小,而一個(gè)存儲(chǔ)單元的大小是8位(bit)。
內(nèi)存中常用的存儲(chǔ)單位是:位(bit)、字節(jié)(Byte)。
1字節(jié)=8位
那么一個(gè)存儲(chǔ)單元也是1字節(jié)。
關(guān)于《存儲(chǔ)單位》的相關(guān)知識(shí),會(huì)以一篇獨(dú)立的文章詳細(xì)講解。
數(shù)據(jù)在內(nèi)存中的表現(xiàn)形式
數(shù)據(jù)在內(nèi)存中是以二進(jìn)制的形式存儲(chǔ)。
十進(jìn)制是由0~9組成,而二進(jìn)制是由0和1組成。
如上圖,這是一個(gè)存儲(chǔ)單元(8bit),有8個(gè)格子,一個(gè)格子表示1bit。而每一個(gè)格子的值要么0,要么為1。其中,白色表示開(kāi),黑色表示關(guān),一般用1和0分別表示開(kāi)和關(guān)。那么用二進(jìn)制表示是01101001,轉(zhuǎn)換為十進(jìn)制的值是105,所以該存儲(chǔ)單元存儲(chǔ)的值就是105。
關(guān)于《進(jìn)制》的相關(guān)知識(shí),會(huì)以一篇獨(dú)立的文章詳細(xì)講解。
此處只講解數(shù)字?jǐn)?shù)據(jù),其他數(shù)據(jù)的表現(xiàn)形式很復(fù)雜。
如何從內(nèi)存中尋找指定的數(shù)據(jù)(內(nèi)存地址)
先舉個(gè)例子:
如上圖,有幾棟樓房,我們都知道,每一棟樓都有一個(gè)具體的地址,而一棟樓的每家每戶都有各自的房號(hào),從而組成一個(gè)完整的地址。而我們的個(gè)人居民身份證就有一個(gè)詳細(xì)地址。
居民身份證除了有地址外,還有身份證號(hào)碼,每一個(gè)號(hào)碼都是唯一。
如何從內(nèi)存中尋找指定的數(shù)據(jù)?
內(nèi)存中的存儲(chǔ)單元就像人一樣,都有著獨(dú)一無(wú)二的“身份證號(hào)碼”,就是地址。比如警察叔叔根據(jù)身份證號(hào)碼就能查到對(duì)應(yīng)的個(gè)人信息。
再舉個(gè)例子:
如上圖,這是一個(gè)書(shū)柜,又分成若干個(gè)小柜子,現(xiàn)對(duì)每個(gè)小柜子進(jìn)行分類(lèi)放置書(shū)籍并設(shè)置標(biāo)簽。我們要尋找某一本書(shū)時(shí),根據(jù)標(biāo)簽就可以輕松找到。程序運(yùn)行時(shí)也是一樣,知道要在什么地址進(jìn)行數(shù)據(jù)的讀寫(xiě)操作。
其他疑問(wèn)
為什么要分十進(jìn)制而二進(jìn)制?
簡(jiǎn)單說(shuō),十進(jìn)制是給人用的,而二進(jìn)制是給機(jī)器用的。
數(shù)據(jù)有數(shù)字、字母、符號(hào)、聲音、圖像等等。數(shù)據(jù)是以二進(jìn)制的形式存儲(chǔ)在內(nèi)存中。
內(nèi)存數(shù)據(jù)輸出到顯示器時(shí),為什么可以顯示我們?nèi)祟?lèi)能看懂的信息?
內(nèi)存中的數(shù)據(jù)是經(jīng)過(guò)轉(zhuǎn)換處理后,我們才能看懂。我們所看到的數(shù)據(jù)(例如一篇文章、一張照片、一部電影),它們的本質(zhì)還是二進(jìn)制。
你不知道的內(nèi)存知識(shí)
一、CPU與內(nèi)存
先鋪墊幾個(gè)概念,以免后面混亂:
Socket或Processor: 指一個(gè)物理CPU芯片,盒裝還是散裝的。上面有很多針腳,直接安裝在主板上。
Core : 指在Processor里封裝一個(gè)CPU核心,每個(gè)Core都是完全獨(dú)立的計(jì)算單元,我們平時(shí)說(shuō)的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。
咱們先來(lái)看幾個(gè)問(wèn)題:
1、CPU可以直接操作內(nèi)存嗎?
可能一大部分老鐵肯定會(huì)說(shuō):肯定的啊,不能操作內(nèi)存怎么讀取數(shù)據(jù)呢。
其實(shí)如果我們用這聰明的大腦想一想,咱們的臺(tái)式主機(jī)大家肯定都玩過(guò)。上面CPU和內(nèi)存條是兩個(gè)完全獨(dú)立的硬件啊,而且CPU也沒(méi)有任何直接插槽用于掛載內(nèi)存條的。
也就是說(shuō),CPU和內(nèi)存條是物理隔離的,CPU并不能直接的訪問(wèn)內(nèi)存條,而是需要借助主板上的其他硬件間接的來(lái)實(shí)現(xiàn)訪問(wèn)。
2、CPU的運(yùn)算速度和內(nèi)存條的訪問(wèn)速度差距有多大?
呵呵呵,這么說(shuō)吧,就是一個(gè)鴻溝啊,CPU的運(yùn)算速度與內(nèi)存訪問(wèn)速度之間的差距是100倍。
而由于CPU與內(nèi)存之間的速度差存在N個(gè)數(shù)量級(jí)的巨大鴻溝,于是CPU最親密的小伙伴Cache 閃亮登場(chǎng)了。與DRAM 家族的內(nèi)存(Memory)不同,Cache來(lái)自SRAM家族。
而DRAM與SRAM的最簡(jiǎn)單區(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í)是被保存在電容里的,所以每次讀寫(xiě)過(guò)程中的充放電環(huán)節(jié)也導(dǎo)致了DRAM讀寫(xiě)數(shù)據(jù)有一個(gè)延時(shí)的問(wèn)題,這個(gè)延時(shí)通常為十幾到幾十ns。
內(nèi)存可以被看作一個(gè)二維數(shù)組,每個(gè)存儲(chǔ)單元都有其行地址和列地址。
由于SRAM的容量很小,所以存儲(chǔ)單元的地址(行與列)比較短,可以被一次性傳輸?shù)絊RAM中。DRAM則需要分別傳送行與列的地址。
SRAM的頻率基本與CPU的頻率保持一致,而DRAM的頻率直到DDR4以后才開(kāi)始接近CPU的頻率。
3、Cache 是怎么使用的?
其實(shí)Cache 是被集成到CPU內(nèi)部的一個(gè)存儲(chǔ)單元(平時(shí)也被我們稱(chēng)為高速緩存),由于其造價(jià)昂貴,并且存儲(chǔ)容量遠(yuǎn)遠(yuǎn)不能滿足CPU大量、高速存取的需求。
所以出于對(duì)成本的控制,在現(xiàn)實(shí)中往往采用金字塔形的多級(jí)Cache體系來(lái)實(shí)現(xiàn)最佳緩存效果。
于是出現(xiàn)了,一級(jí)Cache(L1 Cache)、二級(jí)Cache(L2 Cache)及三級(jí)Cache(L3 Cache)。每一級(jí)都犧牲了部分性能指標(biāo)來(lái)?yè)Q取更大的容量,目的也是存儲(chǔ)更多的熱點(diǎn)數(shù)據(jù)。
以Intel家族Intel SandyBridge架構(gòu)的CPU為例:
L1 Cache容量為64KB,訪問(wèn)速度為1ns左右
L2Cache容量擴(kuò)大4倍,達(dá)到256KB,訪問(wèn)速度則降低到3ns左右
L3 Cache的容量則擴(kuò)大512倍,達(dá)到32MB,訪問(wèn)速度也下降到12ns左右(也比訪問(wèn)主存的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受限于制造工藝,并沒(méi)有被集成到CPU內(nèi)部,而是被集成在主板上,如圖:
從上圖我們也能看出來(lái),CPU如果要訪問(wèn)內(nèi)存中的數(shù)據(jù),則需要經(jīng)過(guò)L1、L2、L3三道關(guān)卡,就是這三個(gè)Cache中都沒(méi)有需要的數(shù)據(jù),才會(huì)從主內(nèi)存中直接進(jìn)行讀取。
最后我們來(lái)看下Intel Sandy Bridge CPU的架構(gòu)圖:
二、多核CPU與內(nèi)存共享的問(wèn)題
問(wèn)題:Cache一致性問(wèn)題
多核CPU共享內(nèi)存的問(wèn)題也被稱(chēng)為Cache一致性問(wèn)題。
其實(shí)就是多個(gè)CPU核心看到的Cache數(shù)據(jù)應(yīng)該是一致的,在某個(gè)數(shù)據(jù)被某個(gè)CPU寫(xiě)入自己的Cache(L1 Cache)以后,其他CPU都應(yīng)該能看到相同的Cache數(shù)據(jù)。
如果在自己的Cache中有舊數(shù)據(jù),則拋棄舊數(shù)據(jù)。
考慮到每個(gè)CPU都有自己內(nèi)部獨(dú)占的Cache,所以這個(gè)問(wèn)題與分布式Cache保持同步的問(wèn)題是同一類(lèi)問(wèn)題
目前業(yè)界公認(rèn)的解決一致性問(wèn)題的最佳方案就是Intel 的MESI協(xié)議了,大多數(shù)SMP架構(gòu)都采用了這一方案。
解決方案:MESI
不知道大家還記得Cache Line 嗎,就是我們常說(shuō)的高速緩存中緩存條目里面的那個(gè)緩存行。
其實(shí)仔細(xì)想想,在進(jìn)行I/O操作從來(lái)不以字節(jié)為單位,而是以塊為單位,有兩個(gè)原因:
I/O 操作比較慢,所以讀一個(gè)字節(jié)與讀連續(xù)N個(gè)字節(jié)的花費(fèi)時(shí)間基本相同
數(shù)據(jù)訪問(wèn)一般都具有空間連續(xù)的特征
所以CPU針對(duì)Memory的讀寫(xiě)也采用了類(lèi)似于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來(lái)標(biāo)識(shí)自身狀態(tài),總共四種:
M(Modified):修改狀態(tài),在其他CPU上沒(méi)有數(shù)據(jù)的副本,并且在本CPU上被修改過(guò),與存儲(chǔ)器中的數(shù)據(jù)不一致,最終必然會(huì)引發(fā)系統(tǒng)總線的寫(xiě)指令,將Cache Line中的數(shù)據(jù)寫(xiě)回Memory中。
E(E__clusive):獨(dú)占狀態(tài),表示當(dāng)前Cache Line中的數(shù)據(jù)與Memory中的數(shù)據(jù)一致,此外,在其他CPU上沒(méi)有數(shù)據(jù)的副本。
S(Shared):共享狀態(tài),表示Cache Line中的數(shù)據(jù)與Memory中的數(shù)據(jù)一致,而且當(dāng)前CPU至少在其他某個(gè)CPU中有副本。
I(Invalid):無(wú)效狀態(tài),在當(dāng)前Cache Line中沒(méi)有有效數(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(高速緩存)的讀寫(xiě)操作引發(fā)了Cache Line(緩存行)的狀態(tài)變化,因而可以將其理解為一種狀態(tài)機(jī)模型。
但MESI的復(fù)雜和獨(dú)特之處在于狀態(tài)有兩種視角:
一種是當(dāng)前讀寫(xiě)操作(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)過(guò)程可以看我另一篇文章:看懂這篇,才能說(shuō)了解并發(fā)底層技術(shù)
深入理解不一致性內(nèi)存
MESI協(xié)議解決了多核CPU下的Cache一致性問(wèn)題,因而成為SMP架構(gòu)的唯一選擇,而SMP架構(gòu)近幾年迅速在PC領(lǐng)域(__86)發(fā)展。
SMP架構(gòu)是一種平行的架構(gòu),所有CPU Core都被連接到一個(gè)內(nèi)存總線上,它們平等訪問(wèn)內(nèi)存,同時(shí)整個(gè)內(nèi)存是統(tǒng)一結(jié)構(gòu)、統(tǒng)一尋址的。
如下所示給出了SMP架構(gòu)的示意圖:
隨著CPU核心數(shù)量的不斷增加,SMP架構(gòu)也暴露出天生的短板,其根本瓶頸是共享內(nèi)存總線的帶寬無(wú)法滿足CPU數(shù)量的增加,同時(shí),在一條“馬路”上通行的“車(chē)”多了,難免會(huì)陷入“擁堵模式”。
不知道你是否聽(tīng)說(shuō)過(guò)總線風(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訪問(wèn)自家內(nèi)存的時(shí)候會(huì)非??欤谠L問(wèn)其他CPU控制的內(nèi)存數(shù)據(jù)時(shí),則需要通過(guò)內(nèi)部互聯(lián)通道訪問(wè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
我們來(lái)看一個(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之間都通過(guò)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還是有巨大差異的。
在這種情況下無(wú)法通過(guò)嗅探總線的方式來(lái)實(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)存”概念,目前還沒(méi)有任意一種編程語(yǔ)言從內(nèi)存模型上支持它,當(dāng)前也很難開(kāi)發(fā)適應(yīng)NUMA的軟件。
Java在支持NUMA的系統(tǒng)里,可以開(kāi)啟基于NUMA的內(nèi)存分配方案,使得當(dāng)前線程所需的內(nèi)存從對(duì)應(yīng)的Node上分配,從而大大加快對(duì)象的創(chuàng)建過(guò)程
在大數(shù)據(jù)領(lǐng)域,NUMA系統(tǒng)正發(fā)揮著越來(lái)越強(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
內(nèi)存條的基礎(chǔ)知識(shí)
上一篇:電腦內(nèi)存容量多大合適