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会被存储在内存的另一部分。每次执行这条指令时,再次访问主内存都是无用的。因此我们将其中一些存储在另一个缓存中,我们称之为数据缓存。