第二節(jié):內(nèi)存層次結(jié)構(gòu)
當(dāng)有人們提到“內(nèi)存”這個(gè)詞的時(shí)候,往往都與主板上的專門提供數(shù)據(jù)存儲(chǔ)能力的芯片聯(lián)系起來(lái)。通常將這類提供存儲(chǔ)能力的芯片稱之為隨機(jī)存儲(chǔ)器(RAM),主內(nèi)存(main memory),和主存儲(chǔ)器(primary storage).回首計(jì)算機(jī)的鐵器時(shí)代,大型機(jī)大行其道的時(shí)候,稱之為核心部件(core)。這些芯片提供的存儲(chǔ)只是臨時(shí)的,也就是說(shuō),存儲(chǔ)在這些芯片里的數(shù)據(jù)只要當(dāng)電源被關(guān)閉以后也隨之消失。
有這么幾類RAM
動(dòng)態(tài) RAM(DRAM)一秒鐘內(nèi)會(huì)進(jìn)行數(shù)千次的充電動(dòng)作。同步 DRAM (SDRAM) 隨著處理器高速的時(shí)鐘運(yùn)行速度下保持同步刷新。靜態(tài) RAM(SRAM)不需要像DRAM那樣頻繁的刷新,這使得它的速度大大加快。不幸地是,SRAM的價(jià)格也比DRAM昂貴得多,只得以被少量的使用。 SRAM適合用于處理器的高速緩存,DRAM則適用于大規(guī)模的主存儲(chǔ)器。最后還有一種視頻RAM(VRAM),它是一種有視頻硬件使用的一類內(nèi)存。在下一章中,會(huì)有一個(gè)例子用語(yǔ)演示如何通過(guò)控制VRAM來(lái)向屏幕輸出信息。
最近隨著某些硬件廠商對(duì)技術(shù)的不斷進(jìn)步和特別的性能優(yōu)化實(shí)現(xiàn)又衍生出很多新的縮寫出來(lái),下面有幾個(gè):
DDR SDRAM是雙倍數(shù)據(jù)傳輸速率的同步隨機(jī)存儲(chǔ)器。使用DDR SDRAM 數(shù)據(jù)可以在一個(gè)系統(tǒng)時(shí)間周期的上升沿和下降沿同時(shí)讀取數(shù)據(jù),基本上兩倍于常規(guī)的可用帶寬。RDRAM是Rambus DRAM的簡(jiǎn)稱,由Rambus公司出售的高性能版本的DRAM,它可以達(dá)到800MHz的傳輸速率。增強(qiáng)型的同步DRAM(ESDRAM),由 Enhanced Memory Systems,Inc 公司生產(chǎn),作為取代SRAM的一種更廉價(jià)的SDRAM。
1(bit)比特是一個(gè)二進(jìn)制數(shù),(例如一個(gè)1或者一個(gè)0)。RAM中由比特這樣的基本單元結(jié)構(gòu)構(gòu)成,依據(jù)RAM的類型,以某種晶體管和電容器的布局方式組成。每一個(gè)單元是一個(gè)可以設(shè)置為‘開(kāi)’ 和‘關(guān)’的數(shù)字開(kāi)關(guān)(例如:1或者0)。這些單元每八個(gè)分為一組成為字節(jié)(bytes)。字節(jié)是用來(lái)計(jì)量存儲(chǔ)器所提供的內(nèi)存總量的的基本單位。在過(guò)去,硬件廠商曾經(jīng)使用不同大小的byte單位。有些使用6比特作為一個(gè)字節(jié),還有使用16字節(jié)作為一個(gè)字節(jié)。而現(xiàn)在所有人都遵守了相同的8比特一為個(gè)字節(jié)的標(biāo)準(zhǔn)。
以下是以byte為單位的內(nèi)存單位容量說(shuō)明。
1 byte = 8bits
1 word = 2bytes
1 double word = 4bytes
1 quad word = 8bytes
1 octal word = 8bytes
1 paragraph = 16bytes
1 kilobyte(KB) = 1,024bytes
1 megabyte(MB) = 1,024KB = 1,048,576bytes
1 gigabyte(GB) = 1,024MB = 1,073,741,824bytes
1 terabyte(TB) = 1,024GB = 1,099,511,627,776bytes
1 petabyte(PB) = 1,024TB = 1,125,899,906,842,624bytes
注解:在80年代,擁有一個(gè)上M的DRAM內(nèi)存已經(jīng)很了不起了。孩子們不斷的游說(shuō)父母再升級(jí)16KB的內(nèi)存,讓他們?cè)贏tari400可以玩上更復(fù)雜一些的游戲。在那個(gè)時(shí)候只有1M內(nèi)存并不是什么大問(wèn)題,因?yàn)檐浖こ處焸兌純A向使用匯編代碼構(gòu)建更加精巧的程序。實(shí)際上,經(jīng)常有人引用比爾蓋茨于1981年的一句話:"640K的內(nèi)存對(duì)于每個(gè)人都綽綽有余了"
而今,大多數(shù)用于開(kāi)發(fā)的計(jì)算機(jī)至少擁有128M的DRAM,在2002年擁有256M被視為是標(biāo)準(zhǔn)配置。此后的十年內(nèi)。上G的內(nèi)存將作為標(biāo)準(zhǔn)配置出現(xiàn)。(如果我們?nèi)允褂肈RAM)。希望以后不要有人引用我的這段話。
RAM并不是唯一存儲(chǔ)數(shù)據(jù)的地方,這里引出了我們內(nèi)存層次結(jié)構(gòu)的議題。不同的數(shù)據(jù)存儲(chǔ)位置,根據(jù)與處理器的遠(yuǎn)近關(guān)系排列。排列后產(chǎn)生了如下層次結(jié)構(gòu):
1.Registers 寄存器
2.Cache 高速緩存區(qū)
3.RAM 主內(nèi)存
4.Disk storage 硬盤
這些存儲(chǔ)器之間最大的區(qū)別在于存儲(chǔ)時(shí)滯或者說(shuō)延遲。訪問(wèn)靠近處理器的存儲(chǔ)設(shè)備所用的時(shí)間比相對(duì)稍遠(yuǎn)處理器的存儲(chǔ)器少。處理器訪問(wèn)硬盤上數(shù)據(jù)的時(shí)間遠(yuǎn)遠(yuǎn)的大于處理器訪問(wèn)它內(nèi)部的高速緩沖區(qū)數(shù)據(jù)的響應(yīng)速度。比如,DRAM往往使用納秒來(lái)衡量時(shí)滯,而硬盤的時(shí)滯,卻是用毫秒來(lái)衡量!(如下表1.1)
圖 1-1
寄存器是位于處理器內(nèi)部的小型存儲(chǔ)器。寄存器是處理器鐘愛(ài)的工作區(qū)。處理器的大部分日常工作是對(duì)寄存器中的數(shù)據(jù)進(jìn)行處理。將數(shù)據(jù)在寄存器之間移動(dòng),是最為實(shí)用的數(shù)據(jù)移動(dòng)方式。工程師們?cè)谠O(shè)計(jì)的編譯器時(shí)跨越種種難題,力求將所有變量和常量都保存在寄存器中。應(yīng)用程序狀態(tài)保存在處理器內(nèi)部所擁有的大量寄存器中從而降低了存儲(chǔ)時(shí)滯。因此MIPS64處理器設(shè)計(jì)了32個(gè)64位的通用寄存器。安騰——INtel的下一代64位處理器,更加不可匹敵,它有用竟然數(shù)百個(gè)寄存器。
Intel Pentium處理器擁有多種寄存器(如圖 1-2)其中:6中16位的段寄存器(CS,DS,ES,FS,GS,SS)。8位,32位通用寄存器(EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP )還有一個(gè)32位的錯(cuò)誤標(biāo)志寄存器(EFLAGS)用以標(biāo)識(shí)錯(cuò)誤狀態(tài),以及一個(gè)32位的指令指針寄存器(EIP)。

圖 1-2
高級(jí)內(nèi)存管理的功能得到由四種系統(tǒng)寄存器(GDTR,LDTR,IDTR,TR)和五種模式控制寄存器(CR0,CR1,CR2,CR3,CR4)協(xié)助。這些寄存器的使用方法會(huì)在后面介紹。
注釋: 注意很有意思的是由于歷史的原因Pentium處理器的寄存器數(shù)量受到了限制。由于向后的兼容性的設(shè)計(jì)需求,使得Pentium處理器所擁有的寄存器數(shù)量比當(dāng)年的8086沒(méi)有太多增加。
高速緩沖區(qū)提供訪問(wèn)速度大于DRAM的臨時(shí)存儲(chǔ)器。通過(guò)將程序部分集中放置在高速緩沖區(qū)中的進(jìn)行運(yùn)算的方式,處理器可以避免重復(fù)訪問(wèn)DRAM所帶來(lái)的性能開(kāi)銷,這個(gè)效果十分顯著。有不同類型的高速緩沖區(qū)。L1緩沖區(qū)是位于存儲(chǔ)器內(nèi)部的存儲(chǔ)器。L2是典型的SRAM類型存儲(chǔ)器,于處理器外部。(例如,Intel Pentium4搭載了這樣256或者512KB的高速緩存器)
注釋: 如果你正在嘗試針對(duì)高速緩沖區(qū)優(yōu)化程序代碼,你應(yīng)該避免不必要的函數(shù)調(diào)用。調(diào)用一個(gè)遠(yuǎn)程函數(shù)需要處理器執(zhí)行高速緩沖區(qū)以外的代碼。這將會(huì)導(dǎo)致重新裝載高速緩沖區(qū)里的內(nèi)容。這也便是為什么某些C編譯器提供內(nèi)聯(lián)函數(shù)功能選項(xiàng)的原因。從另一個(gè)方面來(lái)說(shuō),使用內(nèi)聯(lián)函數(shù)比不使用內(nèi)聯(lián)函數(shù)的程序體積更大(占用更多的存儲(chǔ)器空間)時(shí)間和空間的互換的取舍平衡的問(wèn)題一直貫穿整個(gè)計(jì)算科學(xué)領(lǐng)域。
硬盤是數(shù)據(jù)存儲(chǔ)的最后一個(gè)位置。通常,硬盤常常用于創(chuàng)建虛擬內(nèi)存。虛擬內(nèi)存使用硬盤空間來(lái)模擬主內(nèi)存。換言之,將一部分存儲(chǔ)在DRAM上的數(shù)據(jù)寫入硬盤,處理器便可以訪問(wèn)的內(nèi)存總量大于實(shí)際物理內(nèi)存。例如,如果你有10MB的DRAM內(nèi)存并且使用了2MB的硬盤空間作為虛擬內(nèi)存,處理器便可以訪問(wèn)12MB的虛擬內(nèi)存。
注釋:我將在本書中反復(fù)重申的一點(diǎn)是硬盤I/O的嚴(yán)重性能損耗。正如我之前所提到的,硬盤是使用毫秒為單位來(lái)橫定響應(yīng)能力的。處于處理器來(lái)說(shuō)這個(gè)時(shí)間太過(guò)漫長(zhǎng)。這個(gè)情形就類似遠(yuǎn)在北達(dá)科他州做pizza的小店,如果運(yùn)氣好的話,你冰箱里有一個(gè)冷凍pizza,加熱只需要30分鐘。否則你不得不給那個(gè)pizza小店叫份pizza外賣(就好象訪問(wèn)硬盤上的數(shù)據(jù))然后花上幾個(gè)小時(shí)等待外賣小子跨越150英里的距離送到你的房間。
使用虛擬內(nèi)存就好象跟魔鬼打交道,當(dāng)然你會(huì)獲得很多擴(kuò)展內(nèi)存,但是你會(huì)在性能上付出昂貴的代價(jià)。硬盤I/O涉另一整套的操作行為,其中還有一些物理機(jī)械性的。Windows系統(tǒng)的內(nèi)存分頁(yè),粗略的估計(jì)會(huì)因此占用10%的執(zhí)行時(shí)間。管理虛擬內(nèi)存還需要生成大量的內(nèi)存信息記錄。我會(huì)在后面詳細(xì)的談?wù)撚嘘P(guān)虛擬內(nèi)存信息記錄的內(nèi)容。
題外話
我曾經(jīng)在一家ERP的公司工作過(guò),其中一位副主管常常對(duì)過(guò)度濫用硬盤I/O的工程師處以罰金。在代碼復(fù)審時(shí)候,他會(huì)用grep命令搜索源代碼里面的所有 fopen()和fread()標(biāo)準(zhǔn)庫(kù)函數(shù)。我們接受了這樣基本課程:你應(yīng)該盡可能的將一切緩存到內(nèi)存中只有在別無(wú)選擇的情況下才將數(shù)據(jù)保存到硬盤中(這個(gè)操作甚至需要得到他的許可)。歸功于該副主管,公司的三層中間件產(chǎn)品成為產(chǎn)業(yè)中性能最高的。
硬盤總是比RAM便宜,在60年代買一塊8KB的RAM花費(fèi)不菲,用硬盤虛擬內(nèi)存或許很有意義。今天,硬盤和DRAM的價(jià)格差距并不是像以前那樣那么明顯了。買一臺(tái)512MB內(nèi)存的計(jì)算機(jī)并不是大不了的事情。虛擬內(nèi)存可能會(huì)完全成為歷史或者成為某些緊急情況下的數(shù)據(jù)安全方案。