硬碟、內存、CPU寄存器,還有本節要講的Cache,這些都是存儲器,計算機為什麼要有這麼多種存儲器呢?這些存儲器各自有什麼特點?這是本節要討論的問題。
由於硬件技術的限制,我們可以製造出容量很小但很快的存儲器,也可以製造出容量很大但很慢的存儲器,但不可能兩邊的好處都占着,不可能製造出訪問速度又快容量又大的存儲器。因此,現代計算機都把存儲器分成若干級,稱為Memory Hierarchy,按照離CPU由近到遠的順序依次是CPU寄存器、Cache、內存、硬碟,越靠近CPU的存儲器容量越小但訪問速度越快,下圖給出了各種存儲器的容量和訪問速度的典型值。
表 17.1. Memory Hierarchy
對這個表格總結如下。
寄存器、Cache和內存中的數據都是掉電丟失的,這稱為易失性存儲器(Volatile Memory),與之相對的,硬碟是一種非易失性存儲器(Non-volatile Memory)。
除了訪問寄存器由程序指令直接控制之外,訪問其它存儲器都不是由指令直接控制的,有些是硬件自動完成的,有些是操作系統配合硬件完成的。
Cache從內存取數據時會預取一個Cache Line緩存起來,操作系統從硬碟讀數據時會預讀幾個頁面緩存起來,都是希望這些數據以後會被程序訪問到。大多數程序的行為都具有局部性(Locality)的特點:它們會花費大量的時間反覆執行一小段代碼(例如循環),或者反覆訪問一個很小的地址範圍中的數據(例如訪問一個數組)。所以預讀緩存的辦法是很有效的:CPU取一條指令,我把和它相鄰的指令也都緩存起來,CPU很可能馬上就會取到;CPU訪問一個數據,我把和它相鄰的數據也都緩存起來,CPU很可能馬上就會訪問到。設想有兩台計算機,一台有256KB的Cache,另一台沒有Cache,兩台計算機的內存都是512MB的,硬碟都是100GB的,雖然多出來256KB的Cache與內存、硬碟的容量相比微不足道,但訪問Cache比訪問內存、硬碟快幾個數量級,由於局部性原理,CPU大部分時間是在和Cache打交道,有Cache的計算機明顯會快很多。高速存儲器的容量只能做得很小,卻能顯著提升計算機的性能,這就是Memory Hierarchy的意義所在。