高速緩衝儲存器
概述
Cache即快取記憶體,是用來解決主存與CPU速度不匹配的問題,Cache的出現使得CPU可以不直接訪問主存而直接與Cache交換資訊。由於程式訪問的區域性性原理可以很容易設想只要將CPU近期要用到的程式和資料提前從主存送到Cache,那麼就可以做到CPU在一定時間內只訪問Cache,這樣CPU與高速Cache進行通訊,就大大提高了計算機的執行速度
程式的區域性性原理:區域性性原理又表現為:時間區域性性和空間區域性性。時間區域性性是指如果程式中的某條指令一旦執行,則不久之後該指令可能再次被執行;如果某資料被訪問,則不久之後該資料可能再次被訪問。空間區域性性是指一旦程式訪問了某個儲存單元,則不久之後。其附近的儲存單元也將被訪問。
Cache的工作原理
在Cache與主存的地址對映之前,首先要將主存與Cache都分成若干塊,每塊又包括若干個字,並使得它們的大小相同(即塊內的字數相同,因為Cache與主存之間的資料互動是以行為單位,所以他倆每行儲存的字大小必須相同)。
在劃分好塊後,下面要做的就是將主存塊與Cache塊形成對映就行了。而這裡的對映則是通過塊的地址形成對映關係。對於地址對映,首先將主存地址分成兩塊,高$m$位為主存的快地址,低$b$位為塊內地址。(字塊中存放的就是真正使用的資料,只是對映時使用地址來對映)


Cache的讀寫操作
Cache命中率
在一個程式執行期間,設Nc表示cache完成存取的次數,Nm表示主存完成存取的次數,h表示cache的命中率,則:
$$
h = \frac{Nc}{Nc+Nm}
$$
cache/主存系統的平均訪問時間
若$t_c$表示命中時cache的訪問時間,$t_m$表示未命中時主存的訪問時間,h表示cache的命中率,$t_a$表示平均訪問時間,則:
$$
t_a = ht_c+(1-h)t_m
$$
訪問效率
$$
e = \frac{t_c}{t_a} = \frac{t_c}{ht_c+(1-h)t_m}=\frac{1}{h+(1-h)r} = \frac{1}{r+(1-r)h}
$$
其中,$r=\frac{t_m}{t_c}$
關於Cache命中率有一個坑,提前給出來,免得以後犯錯。$t_m$的定義是“未命中時主存訪問的時間”,所以不能單純的理解為“主存的儲存週期”,比如下面一道題
某計算機的儲存系統採用由cache-主存系統構成,cache的儲存週期為10ns,主存的儲存週期為50ns。若CPU執行一段程式時,cache完成存取的次數為4800次,主存完成存取的次數為200次,cache與主存不能同時訪問,求該cache-主存系統的訪問效率。
習慣地認為這裡“$t_m=50ns$”,但是請注意一句話“cache與主存不能同時訪問”,$t_m$的定義是“未命中時主存的訪問時間”,既然“未命中”,說明在該題的情景下,先訪問了cache,用了10ns,再去訪問主存。所以:$t_m=10+50=60ns$
Cache與主存的對映方式
Cache與主存的地址對映方式有很多,有 直接對映 , 全相聯對映 , 組相聯對映 。
1.直接對映
在這種對映方式下, 主存 中的 任一塊 只與 一個快取塊 相對應,對映關係為:$i = j mod C$,其中,$i$為快取塊號,$j$為主存塊號,$C$為快取塊數。

當快取接收到CPU傳送來的主存地址後,只需根據中間c位欄位(假設為00…01)找到快取塊1,然後根據字塊1的“標記”是否與主存地址的高t位相符合,若符合且有效位為1(這裡的有效位用來識別Cache儲存塊中的額資料是否有效,因為有時Cache中的資料是無效的,例如,在初始時刻Cache中的額內容為空,是無意義的),則表示該Cache塊已和主存中的某塊建立了對應關係,則可根據b位塊內地址從Cache塊中取得對應的字,即找到CPU發來的主存地址在快取中所對應的資訊;若不符合,或者有效位為”0”,則主存讀入新的字塊來代替舊的字塊,同時將資訊送往CPU,並修改Cache“標記”。
特點:不靈活,每個主存塊只能按照取模固定地對映到某個快取塊,即使快取內其他塊空著,也不能用來對映。因而如果程式恰好要重複地使用對應同一快取塊的不同主存塊,那麼久需要不同的替換,這樣會降低命中率。
2.全相聯對映
全相聯對映中, 主存 的 任一塊 可以放到 任一快取塊 中。這樣CPU如果獲取主存的內的資料,就需要掃描整個快取,看當前快取中是否包含有所需的主存的資料

特點:全相聯對映允許將主存中的每一字塊對映到Cache中的任意一塊位置上。顯然這種對映方式相對於直接對映,更加靈活,命中率也更高,縮小了塊衝突。同時也因為這個特點,所需的邏輯電路較多,成本也比較高。
3.組相連對映
針對上述直接對映和全相聯映射出現的問題,現在出現一種折中的對映方式,即下面介紹的組相聯對映。該對映方式將所有Cache分為Q組,每組有R塊,則有關係:$i = j mod Q$,其中$i,j$的含義與直接對映中的含義一致

之所以說是折中,是因為按照直接對映中取模的方式,某個主存塊對映到Cache中的組是固定的,但是在組內,又按照全相聯對映原則,“隨意存放”,即通過主存字塊標記可以對映到該組中任意一塊Cache塊。
這裡看似主存地址很複雜,其實只要知道Cache一共有多少組即可確定組地址的位數,字塊內地址與前面兩種對映方式所說的一致,最後通過總位數減去組地址位數和字塊內地址位數即得主存字塊標記位數。