綜述
如今的CPU的速度遠遠高於現代存儲器的速度因此出現了cache。按和CPU距離分爲L1級和L2級(SM)等。這裏主要記錄一下本身對cache的工做方式的學習理解。
cache工做方式
cahe是對內存數據的緩存從而加快CPU對數據的訪問,那麼前提確定是以前從內存中讀取過數據纔會有緩存一說。那麼該如何保證下次對同一塊內存的訪問時能夠找到cache中的緩存呢?這就是cache的作工原理核心。先拋開cache的後續優化版本,從最簡單的實現方式理解學習。最簡單的就是使用 地址信息+data的key-val的方式來進行緩存就能按地址招待數據緩存這就是cache-line。那麼這裏data數據是多少byte合適呢?這取決於實現以最多見的32byte的大小來理解,在此此種狀況下cache-line中的地址信息就不用記錄最低的5bit從而簡化設計;直接使用地址的低5bit來做爲單緩存行行內的字節尋址,這就是cache映射的基本原理。根據這個原理cache的的映射分爲以下幾種。
cache映射方式分類緩存
全關聯
這個不清楚。學習
直接映射
直接映射就是上面原理介紹的方式,cache是一個單列的cache-line表以下圖示意,而由於cache遠小於內存因此cache僅能映射部份內存區域因此一個時間段他映射了內存的不一樣地址空間且是線性的映射,因此有可能發生「顛簸」。緣由是假若有cache總共有四條緩存行,而地址0x*08都會映射到同一行,程序恰好要循環訪問0x****10800和0x****20800這兩個地址則就會出現cache被循環的換入換出,這裏的08就是cache的index的概念。因此後來優化有了以下的方式來解決這個問題。
優化
組相連
直接映射他的缺點就是在有些狀況下會致使cache的「顛簸」。因此後來就想到了讓同一個index的緩存行對應到兩個緩存行上就造成了cache的組的概念,即index相同的cache稱爲一個組(set),這樣一個index就會對應到組寬度n個cache-line,若是n爲2則前面顛簸換出的概念就是原來的1/n即0.5這就是組映射。既然同一個index對應到不止一個cacae-line因此就會加上TAG的概念來區分同一個組的cache-line。組映射這裏最後還有一個概念就是way,他就是一個cache所能映射的index區域,即若是index有5bit則一個way就是五個cache-line以下示意圖所示的:
設計
這樣就是現代cache的緩存映射使用的策略,後續在介紹更加細節的內容。
cache 按組織方式分類blog
最先是所有使用虛擬地址做爲index和tag的,可是由於存在多個虛擬地址映射到同一個物理地址的狀況因此會形成cache的別名(浪費)且在多任務發生任務切換時的清空cache。因此後來優化使用了虛擬地址做爲index物理地址做爲TAG就能有效解決前面的問題,可是VIPT的仍是會有cache別名的問題,因此後來又優化出了PIPT即所有使用物理地址從而完全避免別名可是這種方式的最大問題就是硬件電路實現複雜。索引