日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每个程序员都应该了解的内存知识【第一部分】

發(fā)布時(shí)間:2023/12/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每个程序员都应该了解的内存知识【第一部分】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[編輯的話: Ulrich Drepper最近問我們,是不是有興趣發(fā)表一篇他寫的內(nèi)存方面的長(zhǎng)文。我們不用看太多就已經(jīng)知道,LWN的讀者們會(huì)喜歡這篇文章的。內(nèi)存的使用常常是軟件性能的決定性因子,而如何避免內(nèi)存瓶頸的好文章卻不好找。這篇文章應(yīng)該會(huì)有所幫助。

他的原文很長(zhǎng),超過100頁。我們把它分成了7篇,每隔一到兩周發(fā)表一篇。7篇發(fā)完后,Ulrich會(huì)把全文發(fā)出來。

對(duì)原文重新格式化是個(gè)很有挑戰(zhàn)性的工作,但愿結(jié)果會(huì)不錯(cuò)吧。為了便于網(wǎng)上閱讀,我們把Ulrich的腳注{放在了文章里},而互相引用的超鏈接(和[參考書目])要等到全文出來才能提供。

非常感謝Ultich,感謝他讓LWN發(fā)表這篇文章,期待大家在不久的將來都能寫出內(nèi)存優(yōu)化很棒的軟件。]

第二部分:https://blog.csdn.net/lxlmycsdnfree/article/details/80861631

1 簡(jiǎn)介

早期計(jì)算機(jī)比現(xiàn)在更為簡(jiǎn)單。系統(tǒng)的各種組件例如CPU,內(nèi)存,大容量存儲(chǔ)器和網(wǎng)口,由于被共同開發(fā)因而有非常均衡的表現(xiàn)。例如,內(nèi)存和網(wǎng)口并不比CPU在提供數(shù)據(jù)的時(shí)候更(特別的)快。

曾今計(jì)算機(jī)穩(wěn)定的基本結(jié)構(gòu)悄然改變,硬件開發(fā)人員開始致力于優(yōu)化單個(gè)子系統(tǒng)。于是電腦一些組件的性能大大的落后因而成為了瓶頸。由于開銷的原因,大容量存儲(chǔ)器和內(nèi)存子系統(tǒng)相對(duì)于其他組件來說改善得更為緩慢。

大容量存儲(chǔ)的性能問題往往靠軟件來改善: 操作系統(tǒng)將常用(且最有可能被用)的數(shù)據(jù)放在主存中,因?yàn)楹笳叩乃俣纫焐蠋讉€(gè)數(shù)量級(jí)。或者將緩存加入存儲(chǔ)設(shè)備中,這樣就可以在不修改操作系統(tǒng)的前提下提升性能。{然而,為了在使用緩存時(shí)保證數(shù)據(jù)的完整性,仍然要作出一些修改。}這些內(nèi)容不在本文的談?wù)摲秶畠?nèi),就不作贅述了。

而解決內(nèi)存的瓶頸更為困難,它與大容量存儲(chǔ)不同,幾乎每種方案都需要對(duì)硬件作出修改。目前,這些變更主要有以下這些方式:

  • RAM的硬件設(shè)計(jì)(速度與并發(fā)度)
  • 內(nèi)存控制器的設(shè)計(jì)
  • CPU緩存
  • 設(shè)備的直接內(nèi)存訪問(DMA)

本文主要關(guān)心的是CPU緩存和內(nèi)存控制器的設(shè)計(jì)。在討論這些主題的過程中,我們還會(huì)研究DMA。不過,我們首先會(huì)從當(dāng)今商用硬件的設(shè)計(jì)談起。這有助于我們理解目前在使用內(nèi)存子系統(tǒng)時(shí)可能遇到的問題和限制。我們還會(huì)詳細(xì)介紹RAM的分類,說明為什么會(huì)存在這么多不同類型的內(nèi)存。

本文不會(huì)包括所有內(nèi)容,也不會(huì)包括最終性質(zhì)的內(nèi)容。我們的討論范圍僅止于商用硬件,而且只限于其中的一小部分。另外,本文中的許多論題,我們只會(huì)點(diǎn)到為止,以達(dá)到本文目標(biāo)為標(biāo)準(zhǔn)。對(duì)于這些論題,大家可以閱讀其它文檔,獲得更詳細(xì)的說明。

當(dāng)本文提到操作系統(tǒng)特定的細(xì)節(jié)和解決方案時(shí),針對(duì)的都是Linux。無論何時(shí)都不會(huì)包含別的操作系統(tǒng)的任何信息,作者無意討論其他操作系統(tǒng)的情況。如果讀者認(rèn)為他/她不得不使用別的操作系統(tǒng),那么必須去要求供應(yīng)商提供其操作系統(tǒng)類似于本文的文檔。

在開始之前最后的一點(diǎn)說明,本文包含大量出現(xiàn)的術(shù)語“經(jīng)常”和別的類似的限定詞。這里討論的技術(shù)在現(xiàn)實(shí)中存在于很多不同的實(shí)現(xiàn),所以本文只闡述使用得最廣泛最主流的版本。在闡述中很少有地方能用到絕對(duì)的限定詞。

1.1文檔結(jié)構(gòu)

這個(gè)文檔主要視為軟件開發(fā)者而寫的。本文不會(huì)涉及太多硬件細(xì)節(jié),所以喜歡硬件的讀者也許不會(huì)覺得有用。但是在我們討論一些有用的細(xì)節(jié)之前,我們先要描述足夠多的背景。

在這個(gè)基礎(chǔ)上,本文的第二部分將描述RAM(隨機(jī)寄存器)。懂得這個(gè)部分的內(nèi)容很好,但是此部分的內(nèi)容并不是懂得其后內(nèi)容必須部分。我們會(huì)在之后引用不少之前的部分,所以心急的讀者可以跳過任何章節(jié)來讀他們認(rèn)為有用的部分。

第三部分會(huì)談到不少關(guān)于CPU緩存行為模式的內(nèi)容。我們會(huì)列出一些圖標(biāo),這樣你們不至于覺得太枯燥。第三部分對(duì)于理解整個(gè)文章非常重要。第四部分將簡(jiǎn)短的描述虛擬內(nèi)存是怎么被實(shí)現(xiàn)的。這也是你們需要理解全文其他部分的背景知識(shí)之一。

第五部分會(huì)提到許多關(guān)于Non Uniform Memory Access (NUMA)系統(tǒng)。

第六部分是本文的中心部分。在這個(gè)部分里面,我們將回顧其他許多部分中的信息,并且我們將給閱讀本文的程序員許多在各種情況下的編程建議。如果你真的很心急,那么你可以直接閱讀第六部分,并且我們建議你在必要的時(shí)候回到之前的章節(jié)回顧一下必要的背景知識(shí)。

本文的第七部分將介紹一些能夠幫助程序員更好的完成任務(wù)的工具。即便在徹底理解了某一項(xiàng)技術(shù)的情況下,距離徹底理解在非測(cè)試環(huán)境下的程序還是很遙遠(yuǎn)的。我們需要借助一些工具。

第八部分,我們將展望一些在未來我們可能認(rèn)為好用的科技。

1.2 反饋問題

作者會(huì)不定期更新本文檔。這些更新既包括伴隨技術(shù)進(jìn)步而來的更新也包含更改錯(cuò)誤。非常歡迎有志于反饋問題的讀者發(fā)送電子郵件。

1.3 致謝

我首先需要感謝Johnray Fuller尤其是Jonathan Corbet,感謝他們將作者的英語轉(zhuǎn)化成為更為規(guī)范的形式。Markus Armbruster提供大量本文中對(duì)于問題和縮寫有價(jià)值的建議。

1.4 關(guān)于本文

本文題目對(duì)David Goldberg的經(jīng)典文獻(xiàn)《What Every Computer Scientist Should Know About Floating-Point Arithmetic》[goldberg]表示致敬。Goldberg的論文雖然不普及,但是對(duì)于任何有志于嚴(yán)格編程的人都會(huì)是一個(gè)先決條件。

2 商用硬件現(xiàn)狀

鑒于目前專業(yè)硬件正在逐漸淡出,理解商用硬件的現(xiàn)狀變得十分重要。現(xiàn)如今,人們更多的采用水平擴(kuò)展,也就是說,用大量小型、互聯(lián)的商用計(jì)算機(jī)代替巨大、超快(但超貴)的系統(tǒng)。原因在于,快速而廉價(jià)的網(wǎng)絡(luò)硬件已經(jīng)崛起。那些大型的專用系統(tǒng)仍然有一席之地,但已被商用硬件后來居上。2007年,Red Hat認(rèn)為,未來構(gòu)成數(shù)據(jù)中心的“積木”將會(huì)是擁有最多4個(gè)插槽的計(jì)算機(jī),每個(gè)插槽插入一個(gè)四核CPU,這些CPU都是超線程的。{超線程使單個(gè)處理器核心能同時(shí)處理兩個(gè)以上的任務(wù),只需加入一點(diǎn)點(diǎn)額外硬件}。也就是說,這些數(shù)據(jù)中心中的標(biāo)準(zhǔn)系統(tǒng)擁有最多64個(gè)虛擬處理器。當(dāng)然可以支持更大的系統(tǒng),但人們認(rèn)為4插槽、4核CPU是最佳配置,絕大多數(shù)的優(yōu)化都針對(duì)這樣的配置

在不同商用計(jì)算機(jī)之間,也存在著巨大的差異。不過,我們關(guān)注在主要的差異上,可以涵蓋到超過90%以上的硬件。需要注意的是,這些技術(shù)上的細(xì)節(jié)往往日新月異,變化極快,因此大家在閱讀的時(shí)候也需要注意本文的寫作時(shí)間。

這么多年來,個(gè)人計(jì)算機(jī)和小型服務(wù)器被標(biāo)準(zhǔn)化到了一個(gè)芯片組上,它由兩部分組成: 北橋和南橋,見圖2.1。


CPU通過一條通用總線(前端總線,FSB)連接到北橋。北橋主要包括內(nèi)存控制器和其它一些組件,內(nèi)存控制器決定了RAM芯片的類型。不同的類型,包括DRAM、Rambus和SDRAM等等,要求不同的內(nèi)存控制器。

為了連通其它系統(tǒng)設(shè)備,北橋需要與南橋通信。南橋又叫I/O橋,通過多條不同總線與設(shè)備們通信。目前,比較重要的總線有PCI、PCI Express、SATA和USB總線,除此以外,南橋還支持PATA、IEEE 1394、串行口和并行口等。比較老的系統(tǒng)上有連接北橋的AGP槽。那是由于南北橋間缺乏高速連接而采取的措施。現(xiàn)在的PCI-E都是直接連到南橋的。

這種結(jié)構(gòu)有一些需要注意的地方:

  • 從某個(gè)CPU到另一個(gè)CPU的數(shù)據(jù)需要走它與北橋通信的同一條總線。
  • 與RAM的通信需要經(jīng)過北橋
  • RAM只有一個(gè)端口。{本文不會(huì)介紹多端口RAM,因?yàn)樯逃糜布徊捎眠@種內(nèi)存,至少程序員無法訪問到。這種內(nèi)存一般在路由器等專用硬件中采用。}
  • CPU與南橋設(shè)備間的通信需要經(jīng)過北橋
在上面這種設(shè)計(jì)中,瓶頸馬上出現(xiàn)了。第一個(gè)瓶頸與設(shè)備對(duì)RAM的訪問有關(guān)。早期,所有設(shè)備之間的通信都需要經(jīng)過CPU,結(jié)果嚴(yán)重影響了整個(gè)系統(tǒng)的性能。為了解決這個(gè)問題,有些設(shè)備加入了直接內(nèi)存訪問(DMA)的能力。DMA允許設(shè)備在北橋的幫助下,無需CPU的干涉,直接讀寫RAM。到了今天,所有高性能的設(shè)備都可以使用DMA。雖然DMA大大降低了CPU的負(fù)擔(dān),卻占用了北橋的帶寬,與CPU形成了爭(zhēng)用。

第二個(gè)瓶頸來自北橋與RAM間的總線。總線的具體情況與內(nèi)存的類型有關(guān)。在早期的系統(tǒng)上,只有一條總線,因此不能實(shí)現(xiàn)并行訪問。近期的RAM需要兩條獨(dú)立總線(或者說通道,DDR2就是這么叫的,見圖2.8),可以實(shí)現(xiàn)帶寬加倍。北橋?qū)?nèi)存訪問交錯(cuò)地分配到兩個(gè)通道上。更新的內(nèi)存技術(shù)(如FB-DRAM)甚至加入了更多的通道。

由于帶寬有限,我們需要以一種使延遲最小化的方式來對(duì)內(nèi)存訪問進(jìn)行調(diào)度。我們將會(huì)看到,處理器的速度比內(nèi)存要快得多,需要等待內(nèi)存。如果有多個(gè)超線程核心或CPU同時(shí)訪問內(nèi)存,等待時(shí)間則會(huì)更長(zhǎng)。對(duì)于DMA也是同樣。

除了并發(fā)以外,訪問模式也會(huì)極大地影響內(nèi)存子系統(tǒng)、特別是多通道內(nèi)存子系統(tǒng)的性能。關(guān)于訪問模式,可參見2.2節(jié)。

在一些比較昂貴的系統(tǒng)上,北橋自己不含內(nèi)存控制器,而是連接到外部的多個(gè)內(nèi)存控制器上(在下例中,共有4個(gè))。


這種架構(gòu)的好處在于,多條內(nèi)存總線的存在,使得總帶寬也隨之增加了。而且也可以支持更多的內(nèi)存。通過同時(shí)訪問不同內(nèi)存區(qū),還可以降低延時(shí)。對(duì)于像圖2.2中這種多處理器直連北橋的設(shè)計(jì)來說,尤其有效。而這種架構(gòu)的局限在于北橋的內(nèi)部帶寬,非常巨大(來自Intel)。{出于完整性的考慮,還需要補(bǔ)充一下,這樣的內(nèi)存控制器布局還可以用于其它用途,比如說「內(nèi)存RAID」,它可以與熱插拔技術(shù)一起使用。}

使用外部?jī)?nèi)存控制器并不是唯一的辦法,另一個(gè)最近比較流行的方法是將控制器集成到CPU內(nèi)部,將內(nèi)存直連到每個(gè)CPU。這種架構(gòu)的走紅歸功于基于AMD Opteron處理器的SMP系統(tǒng)。圖2.3展示了這種架構(gòu)。Intel則會(huì)從Nehalem處理器開始支持通用系統(tǒng)接口(CSI),基本上也是類似的思路——集成內(nèi)存控制器,為每個(gè)處理器提供本地內(nèi)存。


通過采用這樣的架構(gòu),系統(tǒng)里有幾個(gè)處理器,就可以有幾個(gè)內(nèi)存庫(memory bank)。比如,在4 CPU的計(jì)算機(jī)上,不需要一個(gè)擁有巨大帶寬的復(fù)雜北橋,就可以實(shí)現(xiàn)4倍的內(nèi)存帶寬。另外,將內(nèi)存控制器集成到CPU內(nèi)部還有其它一些優(yōu)點(diǎn),這里就不贅述了。

同樣也有缺點(diǎn)。首先,系統(tǒng)仍然要讓所有內(nèi)存能被所有處理器所訪問,導(dǎo)致內(nèi)存不再是統(tǒng)一的資源(NUMA即得名于此)。處理器能以正常的速度訪問本地內(nèi)存(連接到該處理器的內(nèi)存)。但它訪問其它處理器的內(nèi)存時(shí),卻需要使用處理器之間的互聯(lián)通道。比如說,CPU 1如果要訪問CPU 2的內(nèi)存,則需要使用它們之間的互聯(lián)通道。如果它需要訪問CPU 4的內(nèi)存,那么需要跨越兩條互聯(lián)通道。

使用互聯(lián)通道是有代價(jià)的。在討論訪問遠(yuǎn)端內(nèi)存的代價(jià)時(shí),我們用「NUMA因子」這個(gè)詞。在圖2.3中,每個(gè)CPU有兩個(gè)層級(jí): 相鄰的CPU,以及兩個(gè)互聯(lián)通道外的CPU。在更加復(fù)雜的系統(tǒng)中,層級(jí)也更多。甚至有些機(jī)器有不止一種連接,比如說IBM的x445和SGI的Altix系列。CPU被歸入節(jié)點(diǎn),節(jié)點(diǎn)內(nèi)的內(nèi)存訪問時(shí)間是一致的,或者只有很小的NUMA因子。而在節(jié)點(diǎn)之間的連接代價(jià)很大,而且有巨大的NUMA因子。

目前,已經(jīng)有商用的NUMA計(jì)算機(jī),而且它們?cè)谖磥響?yīng)該會(huì)扮演更加重要的角色。人們預(yù)計(jì),從2008年底開始,每臺(tái)SMP機(jī)器都會(huì)使用NUMA。每個(gè)在NUMA上運(yùn)行的程序都應(yīng)該認(rèn)識(shí)到NUMA的代價(jià)。在第5節(jié)中,我們將討論更多的架構(gòu),以及Linux內(nèi)核為這些程序提供的一些技術(shù)。

除了本節(jié)中所介紹的技術(shù)之外,還有其它一些影響RAM性能的因素。它們無法被軟件所左右,所以沒有放在這里。如果大家有興趣,可以在第2.1節(jié)中看一下。介紹這些技術(shù),僅僅是因?yàn)樗鼈兡茏屛覀兝L制的RAM技術(shù)全圖更為完整,或者是可能在大家購買計(jì)算機(jī)時(shí)能夠提供一些幫助。

以下的兩節(jié)主要介紹一些入門級(jí)的硬件知識(shí),同時(shí)討論內(nèi)存控制器與DRAM芯片間的訪問協(xié)議。這些知識(shí)解釋了內(nèi)存訪問的原理,程序員可能會(huì)得到一些啟發(fā)。不過,這部分并不是必讀的,心急的讀者可以直接跳到第2.2.5節(jié)。

2.1 RAM類型

這些年來,出現(xiàn)了許多不同類型的RAM,各有差異,有些甚至有非常巨大的不同。那些很古老的類型已經(jīng)乏人問津,我們就不仔細(xì)研究了。我們主要專注于幾類現(xiàn)代RAM,剖開它們的表面,研究一下內(nèi)核和應(yīng)用開發(fā)人員們可以看到的一些細(xì)節(jié)。

第一個(gè)有趣的細(xì)節(jié)是,為什么在同一臺(tái)機(jī)器中有不同的RAM?或者說得更詳細(xì)一點(diǎn),為什么既有靜態(tài)RAM(SRAM {SRAM還可以表示「同步內(nèi)存」。}),又有動(dòng)態(tài)RAM(DRAM)。功能相同,前者更快。那么,為什么不全部使用SRAM?答案是,代價(jià)。無論在生產(chǎn)還是在使用上,SRAM都比DRAM要貴得多。生產(chǎn)和使用,這兩個(gè)代價(jià)因子都很重要,后者則是越來越重要。為了理解這一點(diǎn),我們分別看一下SRAM和DRAM一個(gè)位的存儲(chǔ)的實(shí)現(xiàn)過程。

在本節(jié)的余下部分,我們將討論RAM實(shí)現(xiàn)的底層細(xì)節(jié)。我們將盡量控制細(xì)節(jié)的層面,比如,在「邏輯的層面」討論信號(hào),而不是硬件設(shè)計(jì)師那種層面,因?yàn)槟呛翢o必要。


圖2.4展示了6晶體管SRAM的一個(gè)單元。核心是4個(gè)晶體管M1-M4,它們組成兩個(gè)交叉耦合的反相器。它們有兩個(gè)穩(wěn)定的狀態(tài),分別代表0和1。只要保持Vdd有電,狀態(tài)就是穩(wěn)定的。

當(dāng)需要訪問單元的狀態(tài)時(shí),升起字訪問線WL。BL和BL上就可以讀取狀態(tài)。如果需要覆蓋狀態(tài),先將BL和BL設(shè)置為期望的值,然后升起WL。由于外部的驅(qū)動(dòng)強(qiáng)于內(nèi)部的4個(gè)晶體管,所以舊狀態(tài)會(huì)被覆蓋。

更多詳情,可以參考[sramwiki]。為了下文的討論,需要注意以下問題:

一個(gè)單元需要6個(gè)晶體管。也有采用4個(gè)晶體管的SRAM,但有缺陷。

維持狀態(tài)需要恒定的電源。

升起WL后立即可以讀取狀態(tài)。信號(hào)與其它晶體管控制的信號(hào)一樣,是直角的(快速在兩個(gè)狀態(tài)間變化)。

狀態(tài)穩(wěn)定,不需要刷新循環(huán)。

SRAM也有其它形式,不那么費(fèi)電,但比較慢。由于我們需要的是快速RAM,因此不在關(guān)注范圍內(nèi)。這些較慢的SRAM的主要優(yōu)點(diǎn)在于接口簡(jiǎn)單,比動(dòng)態(tài)RAM更容易使用。

2.1.2 動(dòng)態(tài)RAM

動(dòng)態(tài)RAM比靜態(tài)RAM要簡(jiǎn)單得多。圖2.5展示了一種普通DRAM的結(jié)構(gòu)。它只含有一個(gè)晶體管和一個(gè)電容器。顯然,這種復(fù)雜性上的巨大差異意味著功能上的迥異。


動(dòng)態(tài)RAM的狀態(tài)是保持在電容器C中。晶體管M用來控制訪問。如果要讀取狀態(tài),升起訪問線AL,這時(shí),可能會(huì)有電流流到數(shù)據(jù)線DL上,也可能沒有,取決于電容器是否有電。如果要寫入狀態(tài),先設(shè)置DL,然后升起AL一段時(shí)間,直到電容器充電或放電完畢。

動(dòng)態(tài)RAM的設(shè)計(jì)有幾個(gè)復(fù)雜的地方。由于讀取狀態(tài)時(shí)需要對(duì)電容器放電,所以這一過程不能無限重復(fù),不得不在某個(gè)點(diǎn)上對(duì)它重新充電。

更糟糕的是,為了容納大量單元(現(xiàn)在一般在單個(gè)芯片上容納10的9次方以上的RAM單元),電容器的容量必須很小(0.000000000000001法拉以下)。這樣,完整充電后大約持有幾萬個(gè)電子。即使電容器的電阻很大(若干兆歐姆),仍然只需很短的時(shí)間就會(huì)耗光電荷,稱為「泄漏」。

這種泄露就是現(xiàn)在的大部分DRAM芯片每隔64ms就必須進(jìn)行一次刷新的原因。在刷新期間,對(duì)于該芯片的訪問是不可能的,這甚至?xí)斐砂霐?shù)任務(wù)的延宕。(相關(guān)內(nèi)容請(qǐng)察看【highperfdram】一章)

這個(gè)問題的另一個(gè)后果就是無法直接讀取芯片單元中的信息,而必須通過信號(hào)放大器將0和1兩種信號(hào)間的電勢(shì)差增大。

最后一個(gè)問題在于電容器的沖放電是需要時(shí)間的,這就導(dǎo)致了信號(hào)放大器讀取的信號(hào)并不是典型的矩形信號(hào)。所以當(dāng)放大器輸出信號(hào)的時(shí)候就需要一個(gè)小小的延宕,相關(guān)公式如下


這就意味著需要一些時(shí)間(時(shí)間長(zhǎng)短取決于電容C和電阻R)來對(duì)電容進(jìn)行沖放電。另一個(gè)負(fù)面作用是,信號(hào)放大器的輸出電流不能立即就作為信號(hào)載體使用。圖2.6顯示了沖放電的曲線,x軸表示的是單位時(shí)間下的R*C


與靜態(tài)RAM可以即刻讀取數(shù)據(jù)不同的是,當(dāng)要讀取動(dòng)態(tài)RAM的時(shí)候,必須花一點(diǎn)時(shí)間來等待電容的沖放電完全。這一點(diǎn)點(diǎn)的時(shí)間最終限制了DRAM的速度。

當(dāng)然了,這種讀取方式也是有好處的。最大的好處在于縮小了規(guī)模。一個(gè)動(dòng)態(tài)RAM的尺寸是小于靜態(tài)RAM的。這種規(guī)模的減小不單單建立在動(dòng)態(tài)RAM的簡(jiǎn)單結(jié)構(gòu)之上,也是由于減少了靜態(tài)RAM的各個(gè)單元獨(dú)立的供電部分。以上也同時(shí)導(dǎo)致了動(dòng)態(tài)RAM模具的簡(jiǎn)單化。

綜上所述,由于不可思議的成本差異,除了一些特殊的硬件(包括路由器什么的)之外,我們的硬件大多是使用DRAM的。這一點(diǎn)深深的影響了咱們這些程序員,后文將會(huì)對(duì)此進(jìn)行討論。在此之前,我們還是先了解下DRAM的更多細(xì)節(jié)。

2.1.3 DRAM 訪問

一個(gè)程序選擇了一個(gè)內(nèi)存位置使用到了一個(gè)虛擬地址。處理器轉(zhuǎn)換這個(gè)到物理地址最后將內(nèi)存控制選擇RAM芯片匹配了那個(gè)地址。在RAM芯片去選擇單個(gè)內(nèi)存單元,部分的物理地址以許多地址行的形式被傳遞。

它單獨(dú)地去處理來自于內(nèi)存控制器的內(nèi)存位置將完全不切實(shí)際:4G的RAM將需要?232?地址行。地址傳遞DRAM芯片的這種方式首先必須被路由器解析。一個(gè)路由器的N多地址行將有2N?輸出行。這些輸出行能被使用到選擇內(nèi)存單元。使用這個(gè)直接方法對(duì)于小容量芯片不再是個(gè)大問題

但如果許多的單元生成這種方法不在適合。一個(gè)1G的芯片容量(我反感那些SI前綴,對(duì)于我一個(gè) giga-bit將總是230?而不是109 字節(jié))將需要30地址行和2 30 ?選項(xiàng)行。一個(gè)路由器的大小及許多的輸入行以指數(shù)方式遞增當(dāng)速度不被犧牲時(shí)。一個(gè)30地址行路由器需要一大堆芯片的真實(shí)身份另外路由器也就復(fù)雜起來了。更重要的是,傳遞30脈沖在地址行同步要比僅僅傳遞15脈沖困難的多。較少列能精確布局相同長(zhǎng)度或恰當(dāng)?shù)臅r(shí)機(jī)(現(xiàn)代DRAM類型像DDR3能自動(dòng)調(diào)整時(shí)序但這個(gè)限制能讓他什么都能忍受)


圖2.7展示了一個(gè)很高級(jí)別的一個(gè)DRAM芯片,DRAM被組織在行和列里。他們能在一行中對(duì)奇但DRAM芯片需要一個(gè)大的路由器。通過陣列方法設(shè)計(jì)能被一個(gè)路由器和一個(gè)半的multiplexer獲得{多路復(fù)用器(multiplexer)和路由器是一樣的,這的multiplexer需要以路由器身份工作當(dāng)寫數(shù)據(jù)時(shí)候。那么從現(xiàn)在開始我們開始討論其區(qū)別.}這在所有方面會(huì)是一個(gè)大的存儲(chǔ)。例如地址linesa0和a1通過行地址選擇路由器來選擇整個(gè)行的芯片的地址列,當(dāng)讀的時(shí)候,所有的芯片目錄能使其縱列選擇路由器可用,依據(jù)地址linesa2和a3一個(gè)縱列的目錄用于數(shù)據(jù)DRAM芯片的接口類型。這發(fā)生了許多次在許多DRAM芯片產(chǎn)生一個(gè)總記錄數(shù)的字節(jié)匹配給一個(gè)寬范圍的數(shù)據(jù)總線。

對(duì)于寫操作,內(nèi)存單元的數(shù)據(jù)新值被放到了數(shù)據(jù)總線,當(dāng)使用RAS和CAS方式選中內(nèi)存單元時(shí),數(shù)據(jù)是存放在內(nèi)存單元內(nèi)的。這是一個(gè)相當(dāng)直觀的設(shè)計(jì),在現(xiàn)實(shí)中——很顯然——會(huì)復(fù)雜得多,對(duì)于讀,需要規(guī)范從發(fā)出信號(hào)到數(shù)據(jù)在數(shù)據(jù)總線上變得可讀的時(shí)延。電容不會(huì)像前面章節(jié)里面描述的那樣立刻自動(dòng)放電,從內(nèi)存單元發(fā)出的信號(hào)是如此這微弱以至于它需要被放大。對(duì)于寫,必須規(guī)范從數(shù)據(jù)RAS和CAS操作完成后到數(shù)據(jù)成功的被寫入內(nèi)存單元的時(shí)延(當(dāng)然,電容不會(huì)立刻自動(dòng)充電和放電)。這些時(shí)間常量對(duì)于DRAM芯片的性能是至關(guān)重要的,我們將在下章討論它。

另一個(gè)關(guān)于伸縮性的問題是,用30根地址線連接到每一個(gè)RAM芯片是行不通的。芯片的針腳是非常珍貴的資源,以至數(shù)據(jù)必須能并行傳輸就并行傳輸(比如:64位為一組)。內(nèi)存控制器必須有能力解析每一個(gè)RAM模塊(RAM芯片集合)。如果因?yàn)樾阅艿脑蛞蟛l(fā)行訪問多個(gè)RAM模塊并且每個(gè)RAM模塊需要自己獨(dú)占的30或多個(gè)地址線,那么對(duì)于8個(gè)RAM模塊,僅僅是解析地址,內(nèi)存控制器就需要240+之多的針腳。

在很長(zhǎng)一段時(shí)間里,地址線被復(fù)用以解決DRAM芯片的這些次要的可擴(kuò)展性問題。這意味著地址被轉(zhuǎn)換成兩部分。第一部分由地址位a0和a1選擇行(如圖2.7)。這個(gè)選擇保持有效直到撤銷。然后是第二部分,地址位a2和a3選擇列。關(guān)鍵差別在于:只需要兩根外部地址線。需要一些很少的線指明RAS和CAS信號(hào)有效,但是把地址線的數(shù)目減半所付出的代價(jià)更小。可是地址復(fù)用也帶來自身的一些問題。我們將在2.2章中提到。

2.1.4 總結(jié)

如果這章節(jié)的內(nèi)容有些難以應(yīng)付,不用擔(dān)心。縱觀這章節(jié)的重點(diǎn),有:

  • 為什么不是所有的存儲(chǔ)器都是SRAM的原因
  • 存儲(chǔ)單元需要單獨(dú)選擇來使用
  • 地址線數(shù)目直接負(fù)責(zé)存儲(chǔ)控制器,主板,DRAM模塊和DRAM芯片的成本
  • 在讀或?qū)懖僮鹘Y(jié)果之前需要占用一段時(shí)間是可行的
接下來的章節(jié)會(huì)涉及更多的有關(guān)訪問DRAM存儲(chǔ)器的實(shí)際操作的細(xì)節(jié)。我們不會(huì)提到更多有關(guān)訪問SRAM的具體內(nèi)容,它通常是直接尋址。這里是由于速度和有限的SRAM存儲(chǔ)器的尺寸。SRAM現(xiàn)在應(yīng)用在CPU的高速緩存和芯片,它們的連接件很小而且完全能在CPU設(shè)計(jì)師的掌控之下。我們以后會(huì)討論到CPU高速緩存這個(gè)主題,但我們所需要知道的是SRAM存儲(chǔ)單元是有確定的最大速度,這取決于花在SRAM上的艱難的嘗試。這速度與CPU核心相比略慢一到兩個(gè)數(shù)量級(jí)。?

2.2 DRAM訪問細(xì)節(jié)

在上文介紹DRAM的時(shí)候,我們已經(jīng)看到DRAM芯片為了節(jié)約資源,對(duì)地址進(jìn)行了復(fù)用。而且,訪問DRAM單元是需要一些時(shí)間的,因?yàn)殡娙萜鞯姆烹姴⒉皇撬矔r(shí)的。此外,我們還看到,DRAM需要不停地刷新。在這一節(jié)里,我們將把這些因素拼合起來,看看它們是如何決定DRAM的訪問過程。

我們將主要關(guān)注在當(dāng)前的科技上,不會(huì)再去討論異步DRAM以及它的各種變體。如果對(duì)它感興趣,可以去參考[highperfdram]及[arstechtwo]。我們也不會(huì)討論Rambus DRAM(RDRAM),雖然它并不過時(shí),但在系統(tǒng)內(nèi)存領(lǐng)域應(yīng)用不廣。我們將主要介紹同步DRAM(SDRAM)及其后繼者雙倍速DRAM(DDR)。

同步DRAM,顧名思義,是參照一個(gè)時(shí)間源工作的。由內(nèi)存控制器提供一個(gè)時(shí)鐘,時(shí)鐘的頻率決定了前端總線(FSB)的速度。FSB是內(nèi)存控制器提供給DRAM芯片的接口。在我寫作本文的時(shí)候,FSB已經(jīng)達(dá)到800MHz、1066MHz,甚至1333MHz,并且下一代的1600MHz也已經(jīng)宣布。但這并不表示時(shí)鐘頻率有這么高。實(shí)際上,目前的總線都是雙倍或四倍傳輸?shù)?#xff0c;每個(gè)周期傳輸2次或4次數(shù)據(jù)。報(bào)的越高,賣的越好,所以這些廠商們喜歡把四倍傳輸?shù)?00MHz總線宣傳為“有效的”800MHz總線。

以今天的SDRAM為例,每次數(shù)據(jù)傳輸包含64位,即8字節(jié)。所以FSB的傳輸速率應(yīng)該是有效總線頻率乘于8字節(jié)(對(duì)于4倍傳輸200MHz總線而言,傳輸速率為6.4GB/s)。聽起來很高,但要知道這只是峰值速率,實(shí)際上無法達(dá)到的最高速率。我們將會(huì)看到,與RAM模塊交流的協(xié)議有大量時(shí)間是處于非工作狀態(tài),不進(jìn)行數(shù)據(jù)傳輸。我們必須對(duì)這些非工作時(shí)間有所了解,并盡量縮短它們,才能獲得最佳的性能。

2.2.1 讀訪問協(xié)議


圖2.8展示了某個(gè)DRAM模塊一些連接器上的活動(dòng),可分為三個(gè)階段,圖上以不同顏色表示。按慣例,時(shí)間為從左向右流逝。這里忽略了許多細(xì)節(jié),我們只關(guān)注時(shí)鐘頻率、RAS與CAS信號(hào)、地址總線和數(shù)據(jù)總線。首先,內(nèi)存控制器將行地址放在地址總線上,并降低RAS信號(hào),讀周期開始。所有信號(hào)都在時(shí)鐘(CLK)的上升沿讀取,因此,只要信號(hào)在讀取的時(shí)間點(diǎn)上保持穩(wěn)定,就算不是標(biāo)準(zhǔn)的方波也沒有關(guān)系。設(shè)置行地址會(huì)促使RAM芯片鎖住指定的行。

CAS信號(hào)在tRCD(RAS到CAS時(shí)延)個(gè)時(shí)鐘周期后發(fā)出。內(nèi)存控制器將列地址放在地址總線上,降低CAS線。這里我們可以看到,地址的兩個(gè)組成部分是怎么通過同一條總線傳輸?shù)摹?/p>

至此,尋址結(jié)束,是時(shí)候傳輸數(shù)據(jù)了。但RAM芯片任然需要一些準(zhǔn)備時(shí)間,這個(gè)時(shí)間稱為CAS時(shí)延(CL)。在圖2.8中CL為2。這個(gè)值可大可小,它取決于內(nèi)存控制器、主板和DRAM模塊的質(zhì)量。CL還可能是半周期。假設(shè)CL為2.5,那么數(shù)據(jù)將在藍(lán)色區(qū)域內(nèi)的第一個(gè)下降沿準(zhǔn)備就緒。

既然數(shù)據(jù)的傳輸需要這么多的準(zhǔn)備工作,僅僅傳輸一個(gè)字顯然是太浪費(fèi)了。因此,DRAM模塊允許內(nèi)存控制指定本次傳輸多少數(shù)據(jù)。可以是2、4或8個(gè)字。這樣,就可以一次填滿高速緩存的整條線,而不需要額外的RAS/CAS序列。另外,內(nèi)存控制器還可以在不重置行選擇的前提下發(fā)送新的CAS信號(hào)。這樣,讀取或?qū)懭脒B續(xù)的地址就可以變得非常快,因?yàn)椴恍枰l(fā)送RAS信號(hào),也不需要把行置為非激活狀態(tài)(見下文)。是否要將行保持為“打開”狀態(tài)是內(nèi)存控制器判斷的事情。讓它一直保持打開的話,對(duì)真正的應(yīng)用會(huì)有不好的影響(參見[highperfdram])。CAS信號(hào)的發(fā)送僅與RAM模塊的命令速率(Command Rate)有關(guān)(常常記為Tx,其中x為1或2,高性能的DRAM模塊一般為1,表示在每個(gè)周期都可以接收新命令)。

在上圖中,SDRAM的每個(gè)周期輸出一個(gè)字的數(shù)據(jù)。這是第一代的SDRAM。而DDR可以在一個(gè)周期中輸出兩個(gè)字。這種做法可以減少傳輸時(shí)間,但無法降低時(shí)延。DDR2盡管看上去不同,但在本質(zhì)上也是相同的做法。對(duì)于DDR2,不需要再深入介紹了,我們只需要知道DDR2更快、更便宜、更可靠、更節(jié)能(參見[ddrtwo])就足夠了。

2.2.2 預(yù)充電與激活

圖2.8并不完整,它只畫出了訪問DRAM的完整循環(huán)的一部分。在發(fā)送RAS信號(hào)之前,必須先把當(dāng)前鎖住的行置為非激活狀態(tài),并對(duì)新行進(jìn)行預(yù)充電。在這里,我們主要討論由于顯式發(fā)送指令而觸發(fā)以上行為的情況。協(xié)議本身作了一些改進(jìn),在某些情況下是可以省略這個(gè)步驟的,但預(yù)充電帶來的時(shí)延還是會(huì)影響整個(gè)操作。


圖2.9顯示的是兩次CAS信號(hào)的時(shí)序圖。第一次的數(shù)據(jù)在CL周期后準(zhǔn)備就緒。圖中的例子里,是在SDRAM上,用兩個(gè)周期傳輸了兩個(gè)字的數(shù)據(jù)。如果換成DDR的話,則可以傳輸4個(gè)字。

即使是在一個(gè)命令速率為1的DRAM模塊上,也無法立即發(fā)出預(yù)充電命令,而要等數(shù)據(jù)傳輸完成。在上圖中,即為兩個(gè)周期。剛好與CL相同,但只是巧合而已。預(yù)充電信號(hào)并沒有專用線,某些實(shí)現(xiàn)是用同時(shí)降低寫使能(WE)線和RAS線的方式來觸發(fā)。這一組合方式本身沒有特殊的意義(參見[micronddr])。

發(fā)出預(yù)充電信命令后,還需等待tRP(行預(yù)充電時(shí)間)個(gè)周期之后才能使行被選中。在圖2.9中,這個(gè)時(shí)間(紫色部分)大部分與內(nèi)存?zhèn)鬏數(shù)臅r(shí)間(淡藍(lán)色部分)重合。不錯(cuò)。但tRP大于傳輸時(shí)間,因此下一個(gè)RAS信號(hào)只能等待一個(gè)周期。

如果我們補(bǔ)充完整上圖中的時(shí)間線,最后會(huì)發(fā)現(xiàn)下一次數(shù)據(jù)傳輸發(fā)生在前一次的5個(gè)周期之后。這意味著,數(shù)據(jù)總線的7個(gè)周期中只有2個(gè)周期才是真正在用的。再用它乘于FSB速度,結(jié)果就是,800MHz總線的理論速率6.4GB/s降到了1.8GB/s。真是太糟了。第6節(jié)將介紹一些技術(shù),可以幫助我們提高總線有效速率。程序員們也需要盡自己的努力。

SDRAM還有一些定時(shí)值,我們并沒有談到。在圖2.9中,預(yù)充電命令僅受制于數(shù)據(jù)傳輸時(shí)間。除此之外,SDRAM模塊在RAS信號(hào)之后,需要經(jīng)過一段時(shí)間,才能進(jìn)行預(yù)充電(記為tRAS)。它的值很大,一般達(dá)到tRP的2到3倍。如果在某個(gè)RAS信號(hào)之后,只有一個(gè)CAS信號(hào),而且數(shù)據(jù)只傳輸很少幾個(gè)周期,那么就有問題了。假設(shè)在圖2.9中,第一個(gè)CAS信號(hào)是直接跟在一個(gè)RAS信號(hào)后免的,而tRAS為8個(gè)周期。那么預(yù)充電命令還需要被推遲一個(gè)周期,因?yàn)?span style="font-family:'微軟雅黑', Verdana, sans-serif, '宋體';line-height:21px;background-color:rgb(246,246,246);">tRCD、CL和tRP加起來才7個(gè)周期。

DDR模塊往往用w-z-y-z-T來表示。例如,2-3-2-8-T1,意思是:

w 2 CAS時(shí)延(CL)?
x 3 RAS-to-CAS時(shí)延(t?RCD)?
y 2 RAS預(yù)充電時(shí)間(t?RP)?
z 8 激活到預(yù)充電時(shí)間(t?RAS)?
T T1 命令速率

當(dāng)然,除以上的參數(shù)外,還有許多其它參數(shù)影響命令的發(fā)送與處理。但以上5個(gè)參數(shù)已經(jīng)足以確定模塊的性能。

在解讀計(jì)算機(jī)性能參數(shù)時(shí),這些信息可能會(huì)派上用場(chǎng)。而在購買計(jì)算機(jī)時(shí),這些信息就更有用了,因?yàn)樗鼈兣cFSB/SDRAM速度一起,都是決定計(jì)算機(jī)速度的關(guān)鍵因素。

喜歡冒險(xiǎn)的讀者們還可以利用它們來調(diào)優(yōu)系統(tǒng)。有些計(jì)算機(jī)的BIOS可以讓你修改這些參數(shù)。SDRAM模塊有一些可編程寄存器,可供設(shè)置參數(shù)。BIOS一般會(huì)挑選最佳值。如果RAM模塊的質(zhì)量足夠好,我們可以在保持系統(tǒng)穩(wěn)定的前提下將減小以上某個(gè)時(shí)延參數(shù)。互聯(lián)網(wǎng)上有大量超頻網(wǎng)站提供了相關(guān)的文檔。不過,這是有風(fēng)險(xiǎn)的,需要大家自己承擔(dān),可別怪我沒有事先提醒喲。

2.2.3 重充電

談到DRAM的訪問時(shí),重充電是常常被忽略的一個(gè)主題。在2.1.2中曾經(jīng)介紹,DRAM必須保持刷新。……行在充電時(shí)是無法訪問的。[highperfdram]的研究發(fā)現(xiàn),“令人吃驚,DRAM刷新對(duì)性能有著巨大的影響”。

根據(jù)JEDEC規(guī)范,DRAM單元必須保持每64ms刷新一次。對(duì)于8192行的DRAM,這意味著內(nèi)存控制器平均每7.8125μs就需要發(fā)出一個(gè)刷新命令(在實(shí)際情況下,由于刷新命令可以納入隊(duì)列,因此這個(gè)時(shí)間間隔可以更大一些)。刷新命令的調(diào)度由內(nèi)存控制器負(fù)責(zé)。DRAM模塊會(huì)記錄上一次刷新行的地址,然后在下次刷新請(qǐng)求時(shí)自動(dòng)對(duì)這個(gè)地址進(jìn)行遞增。

對(duì)于刷新及發(fā)出刷新命令的時(shí)間點(diǎn),程序員無法施加影響。但我們?cè)诮庾x性能參數(shù)時(shí)有必要知道,它也是DRAM生命周期的一個(gè)部分。如果系統(tǒng)需要讀取某個(gè)重要的字,而剛好它所在的行正在刷新,那么處理器將會(huì)被延遲很長(zhǎng)一段時(shí)間。刷新的具體耗時(shí)取決于DRAM模塊本身。

2.2.4 內(nèi)存類型

我們有必要花一些時(shí)間來了解一下目前流行的內(nèi)存,以及那些即將流行的內(nèi)存。首先從SDR(單倍速)SDRAM開始,因?yàn)樗鼈兪荄DR(雙倍速)SDRAM的基礎(chǔ)。SDR非常簡(jiǎn)單,內(nèi)存單元和數(shù)據(jù)傳輸率是相等的。


在圖2.10中,DRAM單元陣列能以等同于內(nèi)存總線的速率輸出內(nèi)容。假設(shè)DRAM單元陣列工作在100MHz上,那么總線的數(shù)據(jù)傳輸率可以達(dá)到100Mb/s。所有組件的頻率f保持相同。由于提高頻率會(huì)導(dǎo)致耗電量增加,所以提高吞吐量需要付出很高的的代價(jià)。如果是很大規(guī)模的內(nèi)存陣列,代價(jià)會(huì)非常巨大。{功率 = 動(dòng)態(tài)電容 x 電壓2?x 頻率}。而且,提高頻率還需要在保持系統(tǒng)穩(wěn)定的情況下提高電壓,這更是一個(gè)問題。因此,就有了DDR SDRAM(現(xiàn)在叫DDR1),它可以在不提高頻率的前提下提高吞吐量。


我們從圖2.11上可以看出DDR1與SDR的不同之處,也可以從DDR1的名字里猜到那么幾分,DDR1的每個(gè)周期可以傳輸兩倍的數(shù)據(jù),它的上升沿和下降沿都傳輸數(shù)據(jù)。有時(shí)又被稱為“雙泵(double-pumped)”總線。為了在不提升頻率的前提下實(shí)現(xiàn)雙倍傳輸,DDR引入了一個(gè)緩沖區(qū)。緩沖區(qū)的每條數(shù)據(jù)線都持有兩位。它要求內(nèi)存單元陣列的數(shù)據(jù)總線包含兩條線。實(shí)現(xiàn)的方式很簡(jiǎn)單,用同一個(gè)列地址同時(shí)訪問兩個(gè)DRAM單元。對(duì)單元陣列的修改也很小。

SDR DRAM是以頻率來命名的(例如,對(duì)應(yīng)于100MHz的稱為PC100)。為了讓DDR1聽上去更好聽,營(yíng)銷人員們不得不想了一種新的命名方案。這種新方案中含有DDR模塊可支持的傳輸速率(DDR擁有64位總線):

100MHz x 64位 x 2 = 1600MB/s 于是,100MHz頻率的DDR模塊就被稱為PC1600。由于1600 > 100,營(yíng)銷方面的需求得到了滿足,聽起來非常棒,但實(shí)際上僅僅只是提升了兩倍而已。{我接受兩倍這個(gè)事實(shí),但不喜歡類似的數(shù)字膨脹戲法。}


為了更進(jìn)一步,DDR2有了更多的創(chuàng)新。在圖2.12中,最明顯的變化是,總線的頻率加倍了。頻率的加倍意味著帶寬的加倍。如果對(duì)單元陣列的頻率加倍,顯然是不經(jīng)濟(jì)的,因此DDR2要求I/O緩沖區(qū)在每個(gè)時(shí)鐘周期讀取4位。也就是說,DDR2的變化僅在于使I/O緩沖區(qū)運(yùn)行在更高的速度上。這是可行的,而且耗電也不會(huì)顯著增加。DDR2的命名與DDR1相仿,只是將因子2替換成4(四泵總線)。圖2.13顯示了目前常用的一些模塊的名稱。

陣列頻率總線頻率數(shù)據(jù)率名稱(速率)名稱
(FSB)
133MHz266MHz4,256MB/sPC2-4200DDR2-533
166MHz333MHz5,312MB/sPC2-5300DDR2-667
200MHz400MHz6,400MB/sPC2-6400DDR2-800
250MHz500MHz8,000MB/sPC2-8000DDR2-1000
266MHz533MHz8,512MB/sPC2-8500DDR2-1066

圖2.13: DDR2模塊名

在命名方面還有一個(gè)擰巴的地方。FSB速度是用有效頻率來標(biāo)記的,即把上升、下降沿均傳輸數(shù)據(jù)的因素考慮進(jìn)去,因此數(shù)字被撐大了。所以,擁有266MHz總線的133MHz模塊有著533MHz的FSB“頻率”。

DDR3要求更多的改變(這里指真正的DDR3,而不是圖形卡中假冒的GDDR3)。電壓從1.8V下降到1.5V。由于耗電是與電壓的平方成正比,因此可以節(jié)約30%的電力。加上管芯(die)的縮小和電氣方面的其它進(jìn)展,DDR3可以在保持相同頻率的情況下,降低一半的電力消耗。或者,在保持相同耗電的情況下,達(dá)到更高的頻率。又或者,在保持相同熱量排放的情況下,實(shí)現(xiàn)容量的翻番。

DDR3模塊的單元陣列將運(yùn)行在內(nèi)部總線的四分之一速度上,DDR3的I/O緩沖區(qū)從DDR2的4位提升到8位。見圖2.14。


一開始,DDR3可能會(huì)有較高的CAS時(shí)延,因?yàn)镈DR2的技術(shù)相比之下更為成熟。由于這個(gè)原因,DDR3可能只會(huì)用于DDR2無法達(dá)到的高頻率下,而且?guī)挶葧r(shí)延更重要的場(chǎng)景。此前,已經(jīng)有討論指出,1.3V的DDR3可以達(dá)到與DDR2相同的CAS時(shí)延。無論如何,更高速度帶來的價(jià)值都會(huì)超過時(shí)延增加帶來的影響。

DDR3可能會(huì)有一個(gè)問題,即在1600Mb/s或更高速率下,每個(gè)通道的模塊數(shù)可能會(huì)限制為1。在早期版本中,這一要求是針對(duì)所有頻率的。我們希望這個(gè)要求可以提高一些,否則系統(tǒng)容量將會(huì)受到嚴(yán)重的限制。

圖2.15顯示了我們預(yù)計(jì)中各DDR3模塊的名稱。JEDEC目前同意了前四種。由于Intel的45nm處理器是1600Mb/s的FSB,1866Mb/s可以用于超頻市場(chǎng)。隨著DDR3的發(fā)展,可能會(huì)有更多類型加入。

陣列頻率總線頻率數(shù)據(jù)速率名稱(速率)名稱
(FSB)
100MHz400MHz6,400MB/sPC3-6400DDR3-800
133MHz533MHz8,512MB/sPC3-8500DDR3-1066
166MHz667MHz10,667MB/sPC3-10667DDR3-1333
200MHz800MHz12,800MB/sPC3-12800DDR3-1600
233MHz933MHz14,933MB/sPC3-14900DDR3-1866
圖2.15: DDR3模塊名

所有的DDR內(nèi)存都有一個(gè)問題:不斷增加的頻率使得建立并行數(shù)據(jù)總線變得十分困難。一個(gè)DDR2模塊有240根引腳。所有到地址和數(shù)據(jù)引腳的連線必須被布置得差不多一樣長(zhǎng)。更大的問題是,如果多于一個(gè)DDR模塊通過菊花鏈連接在同一個(gè)總線上,每個(gè)模塊所接收到的信號(hào)隨著模塊的增加會(huì)變得越來越扭曲。DDR2規(guī)范允許每條總線(又稱通道)連接最多兩個(gè)模塊,DDR3在高頻率下只允許每個(gè)通道連接一個(gè)模塊。每條總線多達(dá)240根引腳使得單個(gè)北橋無法以合理的方式驅(qū)動(dòng)兩個(gè)通道。替代方案是增加外部?jī)?nèi)存控制器(如圖2.2),但這會(huì)提高成本。

這意味著商品主板所搭載的DDR2或DDR3模塊數(shù)將被限制在最多四條,這嚴(yán)重限制了系統(tǒng)的最大內(nèi)存容量。即使是老舊的32位IA-32處理器也可以使用64GB內(nèi)存。即使是家庭對(duì)內(nèi)存的需求也在不斷增長(zhǎng),所以,某些事必須開始做了。

一種解法是,在處理器中加入內(nèi)存控制器,我們?cè)诘?節(jié)中曾經(jīng)介紹過。AMD的Opteron系列和Intel的CSI技術(shù)就是采用這種方法。只要我們能把處理器要求的內(nèi)存連接到處理器上,這種解法就是有效的。如果不能,按照這種思路就會(huì)引入NUMA架構(gòu),當(dāng)然同時(shí)也會(huì)引入它的缺點(diǎn)。而在有些情況下,我們需要其它解法。

Intel針對(duì)大型服務(wù)器方面的解法(至少在未來幾年),是被稱為全緩沖DRAM(FB-DRAM)的技術(shù)。FB-DRAM采用與DDR2相同的器件,因此造價(jià)低廉。不同之處在于它們與內(nèi)存控制器的連接方式。FB-DRAM沒有用并行總線,而用了串行總線(Rambus DRAM had this back when, too, 而SATA是PATA的繼任者,就像PCI Express是PCI/AGP的繼承人一樣)。串行總線可以達(dá)到更高的頻率,串行化的負(fù)面影響,甚至可以增加帶寬。使用串行總線后

  • 每個(gè)通道可以使用更多的模塊。
  • 每個(gè)北橋/內(nèi)存控制器可以使用更多的通道。
  • 串行總線是全雙工的(兩條線)。
  • FB-DRAM只有69個(gè)腳。通過菊花鏈方式連接多個(gè)FB-DRAM也很簡(jiǎn)單。FB-DRAM規(guī)范允許每個(gè)通道連接最多8個(gè)模塊。

    在對(duì)比下雙通道北橋的連接性,采用FB-DRAM后,北橋可以驅(qū)動(dòng)6個(gè)通道,而且腳數(shù)更少——6x69對(duì)比2x240。每個(gè)通道的布線也更為簡(jiǎn)單,有助于降低主板的成本。

    全雙工的并行總線過于昂貴。而換成串行線后,這不再是一個(gè)問題,因此串行總線按全雙工來設(shè)計(jì)的,這也意味著,在某些情況下,僅靠這一特性,總線的理論帶寬已經(jīng)翻了一倍。還不止于此。由于FB-DRAM控制器可同時(shí)連接6個(gè)通道,因此可以利用它來增加某些小內(nèi)存系統(tǒng)的帶寬。對(duì)于一個(gè)雙通道、4模塊的DDR2系統(tǒng),我們可以用一個(gè)普通FB-DRAM控制器,用4通道來實(shí)現(xiàn)相同的容量。串行總線的實(shí)際帶寬取決于在FB-DRAM模塊中所使用的DDR2(或DDR3)芯片的類型。

    我們可以像這樣總結(jié)這些優(yōu)勢(shì):

    DDR2 FB-DRAM


    如果在單個(gè)通道上使用多個(gè)DIMM,會(huì)有一些問題。信號(hào)在每個(gè)DIMM上都會(huì)有延遲(盡管很小),也就是說,延遲是遞增的。不過,如果在相同頻率和相同容量上進(jìn)行比較,FB-DRAM總是能快過DDR2及DDR3,因?yàn)镕B-DRAM只需要在每個(gè)通道上使用一個(gè)DIMM即可。而如果說到大型內(nèi)存系統(tǒng),那么DDR更是沒有商用組件的解決方案。

    2.2.5 結(jié)論

    通過本節(jié),大家應(yīng)該了解到訪問DRAM的過程并不是一個(gè)快速的過程。至少與處理器的速度相比,或與處理器訪問寄存器及緩存的速度相比,DRAM的訪問不算快。大家還需要記住CPU和內(nèi)存的頻率是不同的。Intel Core 2處理器運(yùn)行在2.933GHz,而1.066GHz FSB有11:1的時(shí)鐘比率(注: 1.066GHz的總線為四泵總線)。那么,內(nèi)存總線上延遲一個(gè)周期意味著處理器延遲11個(gè)周期。絕大多數(shù)機(jī)器使用的DRAM更慢,因此延遲更大。在后續(xù)的章節(jié)中,我們需要討論延遲這個(gè)問題時(shí),請(qǐng)把以上的數(shù)字記在心里。

    前文中讀命令的時(shí)序圖表明,DRAM模塊可以支持高速數(shù)據(jù)傳輸。每個(gè)完整行可以被毫無延遲地傳輸。數(shù)據(jù)總線可以100%被占。對(duì)DDR而言,意味著每個(gè)周期傳輸2個(gè)64位字。對(duì)于DDR2-800模塊和雙通道而言,意味著12.8GB/s的速率。

    但是,除非是特殊設(shè)計(jì),DRAM的訪問并不總是串行的。訪問不連續(xù)的內(nèi)存區(qū)意味著需要預(yù)充電和RAS信號(hào)。于是,各種速度開始慢下來,DRAM模塊急需幫助。預(yù)充電的時(shí)間越短,數(shù)據(jù)傳輸所受的懲罰越小。

    硬件和軟件的預(yù)取(參見第6.3節(jié))可以在時(shí)序中制造更多的重疊區(qū),降低延遲。預(yù)取還可以轉(zhuǎn)移內(nèi)存操作的時(shí)間,從而減少爭(zhēng)用。我們常常遇到的問題是,在這一輪中生成的數(shù)據(jù)需要被存儲(chǔ),而下一輪的數(shù)據(jù)需要被讀出來。通過轉(zhuǎn)移讀取的時(shí)間,讀和寫就不需要同時(shí)發(fā)出了。

    2.3 主存的其它用戶

    除了CPU外,系統(tǒng)中還有其它一些組件也可以訪問主存。高性能網(wǎng)卡或大規(guī)模存儲(chǔ)控制器是無法承受通過CPU來傳輸數(shù)據(jù)的,它們一般直接對(duì)內(nèi)存進(jìn)行讀寫(直接內(nèi)存訪問,DMA)。在圖2.1中可以看到,它們可以通過南橋和北橋直接訪問內(nèi)存。另外,其它總線,比如USB等也需要FSB帶寬,即使它們并不使用DMA,但南橋仍要通過FSB連接到北橋。

    DMA當(dāng)然有很大的優(yōu)點(diǎn),但也意味著FSB帶寬會(huì)有更多的競(jìng)爭(zhēng)。在有大量DMA流量的情況下,CPU在訪問內(nèi)存時(shí)必然會(huì)有更大的延遲。我們可以用一些硬件來解決這個(gè)問題。例如,通過圖2.3中的架構(gòu),我們可以挑選不受DMA影響的節(jié)點(diǎn),讓它們的內(nèi)存為我們的計(jì)算服務(wù)。還可以在每個(gè)節(jié)點(diǎn)上連接一個(gè)南橋,將FSB的負(fù)荷均勻地分擔(dān)到每個(gè)節(jié)點(diǎn)上。除此以外,還有許多其它方法。我們將在第6節(jié)中介紹一些技術(shù)和編程接口,它們能夠幫助我們通過軟件的方式改善這個(gè)問題。

    最后,還需要提一下某些廉價(jià)系統(tǒng),它們的圖形系統(tǒng)沒有專用的顯存,而是采用主存的一部分作為顯存。由于對(duì)顯存的訪問非常頻繁(例如,對(duì)于1024x768、16bpp、60Hz的顯示設(shè)置來說,需要95MB/s的數(shù)據(jù)速率),而主存并不像顯卡上的顯存,并沒有兩個(gè)端口,因此這種配置會(huì)對(duì)系統(tǒng)性能、尤其是時(shí)延造成一定的影響。如果大家對(duì)系統(tǒng)性能要求比較高,最好不要采用這種配置。這種系統(tǒng)帶來的問題超過了本身的價(jià)值。人們?cè)谫徺I它們時(shí)已經(jīng)做好了性能不佳的心理準(zhǔn)備。


    • 第2節(jié): CPU的高速緩存
    • 第3節(jié): 虛擬內(nèi)存
    • 第4節(jié): NUMA系統(tǒng)
    • 第5節(jié): 程序員可以做什么 - 高速緩存的優(yōu)化
    • 第6節(jié):?程序員可以做什么?- 多線程的優(yōu)化
    • 第7節(jié): 內(nèi)存性能工具
    • 第8節(jié): 未來的技術(shù)
    • 第9節(jié): 附錄與參考書目


    總結(jié)

    以上是生活随笔為你收集整理的每个程序员都应该了解的内存知识【第一部分】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。