當前位置:編程學習大全網 - 編程語言 - 內存條的基礎知識

內存條的基礎知識

接口類型,是根據內存條金手指上導電觸片的數量來劃分的。金手指上的導電觸片,也習慣稱為針腳數(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

  • 上一篇:遍歷算法編程主題
  • 下一篇:高分求助英語高手論文摘要英文翻譯
  • copyright 2024編程學習大全網