contributed by <krimson8
, aben20807
, allenchen8210
, dange0
, flawless0714
>
sysprog2018
Cache 提供了加速 CPU 存取記憶體的功能,但隨著 CPU 變成多核、多執行緒,cache 又分成 CPU 共享的 cache 和各自獨立的 cache ,使 cache 的資料存取不再這麼直觀,也遇到了一些問題。
為早期系統採用的 cache 架構,在 CPU core 與 main memory 之間插入 cache,所有的讀取與寫入都需要通過 cache。
雖然 CPU 架構是採用范紐曼型架構(Von Neumann architecture),但是將 instruction 與 data 分離可以有效的提升高速緩存的效率,因此於 L1 cache 會區分為 L1i 與 L1d。詳見:哈佛架構(Harvard architecture)。
隨著系統越來越複雜,cache 的大小漸漸的不夠用,然而增加 L1 cache 的大小卻會帶來巨大的成本,因此採用新增不同大小、不同速度的 cache 解決 cache 不夠用的問題。
值得注意的是,雖然上圖中 L3 cache 看似 CPU 唯一進入 bus 的入口。但是實際上 CPU 在與 main memory 傳輸資料流時,並不需要經過更高級別的 cache。
補充範例:假設某資料在 L2,沒有在 L1。則 CPU 在 L1 miss 時,CPU 會去 L2 找並直接拿來使用,不需要先把資料搬到 L1 後 CPU 再透過 L1 獲得該資料。
除此之外,現代處理器往往附有多個核心,且一個核心可能擁有多個執行緒。處理器的物理核心擁有獨立的硬體資源,大部分早期的多核心處理器甚至擁有獨立的 L2 Cache 而沒有 L3 Cache。比方說,處理器核心都可以獨立運作,除了當需要使用網絡連結這一類資源的時候。而執行緒則幾乎是共用 CPU 上的所有資源。Intel 的處理器上有一些獨立的暫存器供執行緒使用。一個完整的現代處理器的架構就如上圖所示。
在進入多核心多執行緒,cache 的管理就更為複雜了。
上圖為一個雙處理器,雙核心,雙執行緒之範例,可以觀察的以下特性: