由於硬體技術的限制,我們可以製造出容量很小但很快的儲存空間,也可以製造出容量很大但很慢的儲存空間,但不可能兩邊的好處都佔著,不可能製造出訪問速度又快容量又大的儲存空間。因此,現代電腦都把儲存空間分成若干級,稱為Memory Hierarchy,按照離CPU由近到遠的順序依次是CPU寄存器、Cache、記憶體、硬碟,越靠近CPU的儲存空間容量越小但訪問速度越快,給出了各種儲存空間的容量和訪問速度的典型值。
Memory Hierarchy
| 儲存空間類型 |
位於哪裡 |
儲存容量 |
半導體工藝 |
訪問時間 |
如何訪問 |
| CPU寄存器 |
位於CPU執行單元中。 |
CPU寄存器通常只有幾個到幾十個,每個寄存器的容量取決於CPU的字長,所以一共只有幾十到幾百位元組。 |
“寄存器”這個名字就是一種數字電路的名字,它由一組觸發器(Flip-flop)組成,每個觸發器儲存一個Bit的資料,可以做存取和移位等操作。電腦掉電時寄存器中儲存的資料會丟失。 |
寄存器是訪問速度最快的儲存空間,典型的訪問時間是幾納秒。 |
使用哪個寄存器,如何使用寄存器,這些都是由指令決定的。 |
| Cache |
和MMU一樣位於CPU核中。 |
Cache通常分為幾級,最典型的是如所示的兩級Cache,一級Cache更靠近CPU執行單元,二級Cache更靠近實體記憶體,通常一級Cache有幾十到幾百KB,二級Cache有幾百KB到幾MB。 |
Cache和記憶體都是由RAM(Random Access Memory)組成的,可以根據地址隨機訪問,電腦掉電時RAM中儲存的資料會丟失。不同的是,Cache通常由SRAM(Static RAM,靜態RAM)組成,而記憶體通常由DRAM(Dynamic RAM,動態RAM)組成。DRAM電路比SRAM簡單,儲存容量可以做得更大,但DRAM的訪問速度比SRAM慢。 |
典型的訪問時間是幾十納秒。 |
Cache緩衝最近訪問過的記憶體資料,由於Cache的訪問速度是記憶體的幾十倍,所以有效地利用Cache可以大大提高電腦的整體效能。一級Cache是這樣工作的:CPU執行單元要訪問記憶體時首先發出VA,Cache利用VA尋找相應的資料有沒有被緩衝,如果Cache中有就不需要訪問實體記憶體了,是讀操作就直接將Cache中的資料傳給CPU寄存器,是寫操作就直接在Cache中改寫資料;如果Cache中沒有,就去實體記憶體中取資料,但並不是要哪個位元組就取哪個位元組,而是把相鄰的幾十個位元組都取上來緩衝著,以備下次用到,這稱為一個Cache Line,典型的Cache Line大小是32~256位元組。如果電腦還配置了二級緩衝,則在訪問實體記憶體之前先用PA去二級緩衝中尋找。一級緩衝是用VA定址的,二級緩衝是用PA定址的,這是它們的區別。Cache所做的工作是由硬體自動完成的,而不是像寄存器一樣由指令決定先做什麼後做什麼。 |
| 記憶體 |
位於CPU外的晶片,與CPU通過地址和資料匯流排相連。 |
典型的儲存容量是幾百MB到幾GB。 |
由DRAM組成,詳見上面關於Cache的說明。 |
典型的訪問時間是幾百納秒。 |
記憶體是通過地址來訪問的,但是在啟用MMU的情況下,程式指令中的地址是VA,而訪問記憶體用的是PA,並無直接關係,這種情況下記憶體的分配和使用由作業系統通過修改MMU的映射項來協調。 |
| 硬碟 |
位於裝置匯流排上,並不直接和CPU相連,CPU通過裝置匯流排的控制器訪問硬碟。 |
典型的儲存容量是幾百GB。 |
硬碟由磁性介質和磁頭組成,訪問硬碟時存在機械運動,磁頭要移動,磁性介質要旋轉,機械運動的速度很難提高到電子的速度,所以訪問速度很受限制。但是儲存在硬碟上的資料掉電後不會丟失。 |
典型的訪問時間是幾毫秒,是寄存器的106倍。 |
由驅動程式操作裝置匯流排控制器去訪問。由於硬碟的訪問速度較慢,作業系統通常在一次從硬碟上讀幾個頁面(典型值是4KB)到記憶體中緩衝起來,如果這些資料後來都被程式訪問到了,那麼這一次硬碟訪問的時間就可以分攤(Amortize)給多次資料訪問了。 |
對這個表格總結如下。
寄存器、Cache和記憶體中的資料都是掉電丟失的,這稱為易失性儲存空間(Volatile Memory),與之相對的,硬碟是一種非易失性儲存空間(Non-volatile Memory)。
除了訪問寄存器由程式指令直接控制之外,訪問其它儲存空間都不是由指令直接控制的,有些是硬體自動完成的,有些是作業系統配合硬體完成的。
Cache從記憶體取資料時一次取一個Cache Line緩衝起來,作業系統從硬碟取資料時一次取幾KB緩衝起來,都是希望這些資料以後會被訪問到。大多數程式的行為都具有局部性(Locality)的特點:它們會花費大量的時間反覆執行一小段代碼(例如迴圈),或者反覆訪問一個很小的位址範圍中的資料(例如訪問一個數組)。所以預讀緩衝的辦法是很有效:CPU取一條指令,我把它相鄰的指令也都緩衝起來,CPU很可能馬上就會取到;CPU訪問一個資料,我把它相鄰的資料也都緩衝起來,CPU很可能馬上就會訪問到。設想有兩台電腦,一台有32KB的Cache,另一台沒有Cache,而記憶體都是512MB的,硬碟都是100GB的,雖然多出來32KB的Cache和記憶體、硬碟的容量相比微不足道,但由於局部性原理,有Cache的電腦明顯會快很多。高速儲存空間即使容量只能做得很小也能顯著提升電腦的效能,這就是Memory Hierarchy的意義所在。
《Linux C編程一站式學習》http://www.yayu.org/book/Linux_c_study_html/ch17s05.html