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





上一篇:電腦內存容量多大合適
下一篇:電腦怎么增加磁盤內存