快取與程式記憶體分布

2021-09-30 10:43:04 字數 1281 閱讀 9947

今天看了一篇文章,關於cpu cache的7個示例科普cpu cache

突然發現原來自己不知道的東西有這麼多,翻查了一些資料,學到了好多東西,所以趕緊記下來,以後忘了的時候翻出來看看

作為程式設計師,有必要知道cpu是怎麼拿到資料然後處理資料的,優化程式很多都是從這一點做起,這也是我一直想知道的,之前學計算機組成原理和作業系統,沒怎麼認真學,現在才發現原來這些都是很重要的基礎課,如果乙個程式設計師連自己的**是怎麼在機器上執行的都不知道的話,那他就打不出好的**。以前也只懵懵懂懂的知道,訪問記憶體才會消耗cpu,但根本的都沒去了解,今天算是一口氣解決了自己的好多疑問

首先你得知道cache這個東西,非常有必要了解清楚,特別是概念和起執行的原理,網上搜一下,一大堆

cache裡的基本儲存單元是cacheline即快取行,快取通常分為一級快取和二級快取,有些還有**快取,通常資料傳遞路線是硬碟到記憶體到二級快取到一級快取再到cpu暫存器,cpu讀取資料時,首先會先從一級快取那裡讀取,如果該資料存在的話(即cache命中),直接取出資料,這裡並沒有訪問記憶體,如果資料不在一級快取,cpu就會到二級快取那裡尋找,同樣,如果存在則直接取出資料,如果不存在,那就得從記憶體載入該資料了,這時就需要訪問一次記憶體,快取就是為了提高cpu的工作效率。

了解系統的記憶體管理機制也是很重要的,windows系統為每個程序都分配了4g的虛擬記憶體位址,核心佔了2g,剩餘的空間有棧區、堆區、全域性資料區和**區等,中間還有其他的,總結起來就是動態資料區、**區和靜態資料區。c++中每個程式的記憶體分配為**區、全域性資料區、堆區和棧區

c++的記憶體分配方式有三種:

1、從靜態儲存區域分配

編譯時就分配好,執行期間一直存在,如全域性變數、靜態變數

2、在棧上分配

函式內區域性變數,函式執行完後自動釋放,內置於處理器的指令集中,效率很高,記憶體容量有限

3、在堆上分配(動態記憶體分配)

malloc或new申請,free或delete釋放

其實對於區域性變數,為何效率快呢,比較準確的說法是,區域性變數在函式體中被多次引用時,該變數會被放入到快取裡,所以每次讀取資料,只要其存在在快取中就不會去訪問記憶體,但其實如果你在函式體中對區域性變數和靜態變數做同樣次數的引用時,執行時間是一樣長的,幾行**就可以測試出來了

所以程式設計要盡量滿足區域性性原理,區域性性原理又分為時間區域性性和空間區域性性,時間區域性性是指如果程式中的某條指令一旦執行,則不久之後該指令可能再次被執行;如果某資料被訪問,則不久之後該資料可能再次被訪問。空間區域性性是指一旦程式訪問了某個儲存單元,則不久之後。其附近的儲存單元也將被訪問。附近即具有連續位址

。關於記憶體管理的東西還有很多,每天累積一點點,學到了就記下來。

ios 優化 cpu快取與程式記憶體分布

今天看了一篇文章,關於cpu cache的7個示例科普cpu cache 突然發現原來自己不知道的東西有這麼多,翻查了一些資料,學到了好多東西,所以趕緊記下來,以後忘了的時候翻出來看看 作為程式設計師,有必要知道cpu是怎麼拿到資料然後處理資料的,優化程式很多都是從這一點做起,這也是我一直想知道的,...

程式記憶體分布

乙個完整的程式,在記憶體分布中的分布情況如下 1 區 2 全域性資料區 3 堆區 4 棧區 一般程式的由new產生的動態資料存放到堆區,堆用於儲存哪些生存期與函式無關的資料,函式內部的自動變數存放在棧區,區域性變數和函式引數存放在棧區。自動變數一般會隨著函式的退出而釋放空間,靜態資料 即使是函式內部...

程式占用記憶體分布

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由 編譯器自動分配釋放 存放函式的引數名,區域性變數 的名等。其操作方式類似於資料結構中的棧。2 堆區 heap 由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類...