記憶體階層與快取

記憶體階層(memory hierarchy)

想像你讀書時的桌面。攤在眼前的那本書,伸手就拿到。手邊一小疊書,花一秒才抓得到。房間另一頭的書架,要走過去。城裡的公共圖書館,得跑一趟。你沒法把每本書都放在桌上——桌子太小——但每本書都擺在圖書館也沒法做事。於是你把儲存分層安排:又小又即時的放在身邊,又大又慢的擺在遠處,中間再放幾層合理的折衷。記憶體階層對電腦的資料來說,正是這樣的安排。

從最快最小到最慢最大,典型階層是:暫存器(幾十個字組,在 CPU 內部,存取遠不到一奈秒),接著一層或多層快取(L1、L2,常還有 L3——幾千位元組到數十百萬位元組的快速 SRAM),再來是主記憶體(數十億位元組的 DRAM,距離數十奈秒),然後是 SSD 或硬碟之類的儲存(數兆位元組,但慢上千倍到百萬倍)。每往下一層大致是更大、每位元組更便宜、也更慢。階層之所以存在,是因為沒有任何單一記憶體技術能同時又快、又大、又便宜——你必須在三者間取捨,於是把幾種技術疊起來,讓每一層替下一層補位。

重點全在於製造一種錯覺:讓程式設計者以為自己擁有一塊巨大、又幾乎像最頂層那麼快的記憶體。這錯覺之所以成立,是因為真實程式在任一時刻只觸碰自己資料中一小塊、可預測的部分(區域性原理),把那一塊放在上方的快速層級,就能迅速服務大多數存取。階層是現代電腦記憶體感覺起來很快的最重要原因,而讓你的資料住在階層的上方,是程式設計者手上最大的效能槓桿之一。

某台機器的粗略數字:暫存器存取約 0.3 奈秒,L1 命中約 1 奈秒,L2 命中約 4 奈秒,L3 命中約 15 奈秒,主記憶體存取約 80 奈秒,SSD 讀取約 50,000 奈秒。往下探一層,可能多花 5 倍到 1000 倍的時間——這正是為什麼你的資料住在哪一層,影響極大。

每往下一層更大、每位元組更便宜、卻慢得多;階層偽裝出一塊又快又大的記憶體。

階層給的是速度的「錯覺」,不是保證。若程式的存取四處亂跳、難以預測(區域性差),它就一直錯過快速層級,跑得接近主記憶體的速度——答案一樣正確,卻慢上好幾倍。

又称
storage hierarchy記憶體層級