1. 程式人生 > >深入理解計算機系統 第六章 儲存器層次結構

深入理解計算機系統 第六章 儲存器層次結構

 

為什麼要學習儲存器的層次結構?

如果我們理解了系統是如何將資料在儲存器層次結構中上上下下移動的,那麼我們就可以編寫自己的應用程式,使得它們的資料項儲存在層次結構較高的地方,在那裡 CPU 能更快地訪問到它們。

 

區域性性原理

計算機程式傾向於引用臨近於其他最近引用過的資料項的資料項,或者最近引用過的資料項本身。這種傾向性,被稱為區域性性原理。

有良好區域性性的程式比區域性性差的程式執行地更快。且在現代計算機系統的各個層次,從硬體到作業系統、再到應用程式,它們的設計都利用了局部性。

 

快取相關術語介紹

快取命中

當程式需要第 k+1 層的某個資料物件 d 時,他首先在當前儲存在第 k 層的一個塊中查詢 d。如果 d 剛好快取在第 k 層中,那麼就是我們所說的快取命中。

快取不命中

相對於快取命中,如果第 k 層中沒有快取資料物件 d,那麼就是我們所說的快取不命中。

快取不命中的種類

區分不同種類的快取不命中有時候是很有幫助的。如果第 k 層的快取是空的,那麼對任何資料物件的訪問都會不命中。一個空的快取有時被稱為冷快取,此類不命中稱為強制性不命中冷不命中

由於發生不命中的情況是很正常的,所以在不命中發生的時候,必須有對應的放置策略。而如果採用最靈活的方式(即允許第 k+1 層的任何塊放在第 k 層的任何塊中),成本會比較高,因為隨機地放置塊,定位起來代價很高。因此,實際情況中,被使用的通常是更為嚴格的放置策略,即使第 k+1 層的塊對第 k 層的塊有一種“多對一”的對映關係(第 k+1 層的某幾個塊只能對映到第 k 層的某一個塊中),這就會導致一種由放置策略引起的不命中,我們稱之為衝突不命中

 

要編寫快取友好的程式碼,需要遵從以下兩點原則:

1、讓最常見的情況執行的快。程式通常把大部分時間都花在少量的核心函式上,而這些函式通常把大部分時間都花在了少量迴圈上。所以要把注意力集中在核心函式裡的迴圈上,而忽略其他部分。

2、儘量減小每個迴圈內部的快取不命中數量。在其他條件相同的情況下,不命中率較低的迴圈執行得更快。