本文將介紹儲存器層次結構以及區域性性對程式效能的影響。
什麼是儲存器層次結構?這個詞大家也許並不陌生,計算機中的儲存器從暫存器、快取到記憶體、硬碟,形成了乙個層次結構。為什麼不用單一的一種儲存裝置,比如只用硬碟呢?因為每一種儲存裝置都有它的優缺點,硬碟雖然儲存空間大,但傳輸速率太慢,完全跟不上cpu的節奏,直接與cpu交換資料的話會嚴重拉低cpu的執行效率。而記憶體雖然容量小一些,但速度比硬碟快的多,因此介於cpu和硬碟之間。隨著cpu主頻越來越高,cpu與記憶體的交換效率也變得越來越低,因此現代計算機系統在cpu和記憶體之間插入多級快取,以縮小cpu與記憶體之間的頻率差距。區域性性
下圖為完整的儲存器層次結構,從最頂層的暫存器,到最底層的遠端儲存器(包括分布式檔案系統、web伺服器),越往下容量越大、傳輸速率越慢、單位容量**越低。
儲存器層次結構
在儲存器層次結構中,每一層都作為其下一層的快取。比如說,當我們想要從l1 cache中讀取資料的時候,先檢查暫存器中有沒有我們需要的資料,如果有,直接從暫存器中讀取,如果沒有,再從l1 cache中讀取。再比如說,當我們想要從硬碟中讀取資料的時候,先檢查記憶體中有沒有我們需要的資料,如果有,直接從記憶體中讀取,如果沒有,再從硬碟中讀取。
儲存器層次結構的優點在於,作為乙個整體,它的容量相當於最底層的儲存裝置的容量,而它的速度卻相當於最頂層儲存裝置的速度。也就是說,它可以在速度和容量這兩個看似矛盾的方面同時達到極限。
為什麼?為什麼如此神奇?
這是因為程式具有區域性性。
理解區域性性對程式開發人員有極大的幫助。一般來講,有良好區域性性的程式比區域性性差的程式執行得更快。
區域性性有兩種:時間區域性性和空間區域性性。讓我們舉幾個例子來說明吧。
下面的陣列元素求和函式就具有良好的時間區域性性和空間區域性性。
int sumvec(int在該程式中,變數v[n])
return
sum;
}
sum
在每次迴圈迭代中被引用一次。如果同乙個儲存單元在短時間內多次被引用,我們就說該儲存單元具有時間區域性性。向量v
中的元素在迴圈中按照儲存順序依次被讀取,這些被訪問的儲存單元在空間上離的很近,我們就說它們有良好的空間區域性性。
有區域性性良好的程式,就有區域性性不好的程式。下面的二維陣列按列求和就是乙個典型的例子。
int sumarraycols(int由於二維陣列在記憶體中的存放順序是按行排放的,因此該程式相當於以n個元素的間隔訪問資料,這些儲存位置在空間上的距離變大,空間區域性性不好。正確的做法應該是外層迴圈行遍歷,內層迴圈列遍歷。a[m][n])
posted @
2018-11-26 20:29
小時候挺菜 閱讀(
...)
編輯收藏
深入理解計算機作業系統(2 2 4)
在c語言中,對於有符號數和無符號數之間的轉換是從位級的角度來考慮的而不是從數級的角度來考慮的。簡單說就是,對於有符號數和無符號數之間的轉換,我們希望的是在可以表示的範圍內,數值表示不變,但是c語言中,是二進位制位不變,改變解釋二進位制位的方式。舉例 乙個8位的無符號數128,二進位制位是100000...
深入理解計算機作業系統(三)
基本資料型別 大小端模式 整型數範圍與c標準 複合型型別轉換 從short到unsigned 讓我們複習一下c語言中基本資料型別的位元組數 名稱32位 64位char11 short int22 int4 4long int48 long long int88 char 48 float44 dou...
深入理解計算機作業系統(1) 鏈結器
鏈結是將各種 和資料片段收集起來組合成為乙個單一檔案的過程。可能發生在編譯 載入到記憶體 程式執行時候。首先使用預編譯器將mian.cpp翻譯成main.i ascii碼的中間檔案 再使用編譯器翻譯成main.s 彙編檔案 再使用彙編器翻譯成可重定位目標檔案main.o,最後使用鏈結器將main.o...