0

一般來說,桌面有兩種CPU高速緩存以加快內存訪問速度。用於堆內存訪問的高速緩存

1)指令緩存 - >加速可執行指令。

2)數據緩存 - >加快數據的獲取和存儲。

根據我的理解,指令緩存操作程序的代碼段,數據緩存操作程序的數據段。這是正確的嗎?

從堆分配的內存沒有緩存優勢嗎?數據緩存中是否覆蓋了堆內存訪問?

回答

0

指令緩存操作程序的代碼段,數據緩存操作程序的數據段。這是正確的嗎?

不,CPU不知道段。

指令緩存是所有執行訪問,無論它們是代碼段內執行,或者在如動態創建的代碼堆。

數據緩存適用於所有其他,非執行訪問。數據可以在數據段,堆中,甚至在代碼段中作爲常量。

+0

Thanx爲您的答覆。你能詳細闡述一下數據緩存嗎?究竟是什麼原因呢? – Gopinath

+0

當一條指令試圖從內存中讀取某些內容時,它首先檢查數據緩存。如果給定地址處的值已經在緩存中且有效,則該指令使用該值。當一條指令試圖將某些內容寫入內存時,緩存中相應的值更新或無效(標記爲無效)。以上所有可能都取決於爲所訪問的內存區域定義的*高速緩存策略*。 – Tsyvarev

0

根據我的理解,指令緩存操作程序的代碼段,數據緩存操作程序的數據段。這是正確的嗎?

從堆分配的內存沒有緩存優勢嗎?數據緩存中是否覆蓋了堆內存訪問?

內存是內存。 CPU無法區分堆和數據之間的區別。

指令緩存通常只是從程序計數器中的地址開始,然後抓取下N個字節。 CPU仍然不知道它的代碼段或數據段。

0

當您編寫程序時,會將其轉換爲機器可讀的二進制文件。當CPU執行指令時,它會提取這個二進制文件,解碼它的含義,然後執行。基本上這個二進制文件告訴CPU必須執行的指令。如果這個二進制文件只存儲在主存儲器中,那麼在每個提取階段,CPU必須訪問主存儲器,這非常糟糕。相反,我們所做的是將其中的一部分存儲在緩存中,更靠近CPU。由於該緩存只包含與要執行的指令相關的二進制信息,我們稱之爲指令緩存。現在說明需要數據來操作。在您的高層次的代碼,你可能有類似 arrayA[i] = (arrayB[i] + arrayC[i])這將轉化爲以

ADD memLocationStoredInRegisterA, memLocationStoredInRegisterB, memLocationStoredInRegisterC

類似的機器指令的東西該指令存儲在指令高速緩存,但數據,即arrayA,arrayB和arrayC會被存儲在內存的另一部分。每次執行這條指令時,再次訪問主內存都是無用的。因此我們將其中一些存儲在另一個緩存中,我們稱之爲數據緩存。