為什么需要分層存儲?因為我們想要存儲又大又快,但是只用一層存儲無法達到目的,所以我們采用多層存儲讓那些越大越慢的數據距離處理器遠一些,並確保處理器需要的大多數數據存儲在更快的層中。
分層存儲的基本原則
局部性原理
最近使用的代碼或者數據很有可能在不久的將來繼續用到。
局部性原理分為:時間局部性、空間局部性。
一個程序可能在其生命周期中引用不同的內存位置,但不是在同一時間。
避免重復運算
如果計算某個東西計算代價很高,那么可以記住一會兒答案,以防不久之后又需要它。
需要局部性的支持。如果缺乏局部性,會存儲大量不同的數據,同時很可能查詢大量數據的開銷會大於重新計算的開銷。
成本均攤
如果成本可以平攤到多個單元上,那么理論上可以承受較大的成本開銷。
Cache理論基礎
原理
時間局部性:這個數據馬上就會被再次訪問,所以把這個數據放到一個可以快速訪問的內存中。
空間局部性:這個數據周圍的數據馬上也會被訪問,所以把這個數據附近的所有數據(block)放到可以快速訪問的內存中。
流水線中的Cache
我們希望cache的存取盡可能快,而在高頻的流水線中,每個流水段的時間其實也是很快的,那么為了使cache盡可能大並且可以滿足流水線的高頻訪問,所以對cache進行分層處理。目前的處理器都存在着多級的cache(L1,L2 cache等)。
那么誰來管理分層數據遷移?早期的是由程序員來管理的,而現在絕大多數情況是硬件來做的,所以對程序員來說是透明的,但是如果我們能在寫代碼的時候利用一些硬件的性質,就可以讓我們的程序跑得更快。
其中管理cache的硬件就是我們說的內存管理單元(MMU)。
分層的延遲分析
假設一個給定的存儲層次\(i\),它技術上固有的訪問時間是\(t_i\),我們感受到的訪問時間是\(T_i,(T_i>t_i)\)。
除了最外層,最外層中包含着數據的源地址,而其他層中都是這些數據的某些拷貝。當訪問一個固定地址時,可能命中也可能缺失,那么:
如果命中(命中率是\(h\%\)),訪問時間是\(t_i\),
如果缺失,訪問時間是\(t_i+T_{i+1}\),\(T_{i+1}\)表示下一層感知到的訪問時間。
因此
因此我們希望\((1-h_i)*T_{i+1}\)盡可能的低,所以我們可以降低缺失率,或者減少下一層的感知訪問時間。
對於降低缺失率,我們可以增加cache的容量,但是這會使得\(t_i\)增加;還可以通過更好的管理降低缺失率,比如更好的替換策略以及更好的預取策略。
對於減少下一層的感知訪問時間,可以從材料上使下一層訪問更快,但是這會使成本增加;或者引入中間層做出折中。
這里看一個Intel Pentium 4的例子:
可以看到減少缺失率帶來的收益是非常顯著的。
關於Cache的詳細內容,且聽下回分解hhh