缓存堆内存访问

时间:2017-02-13 13:06:24

标签: caching linux-kernel operating-system linux-device-driver cpu-cache

一般情况下,台式机有两种CPU缓存,可以更快地访问内存。

1)指令缓存 - >加快可执行指令。

2)数据缓存 - >加速数据获取和存储。

根据我的理解,指令缓存在程序的代码段上运行,数据缓存在程序的数据段上运行。这是对的吗?

从堆分配的内存是否没有缓存优势?堆内存访问是否包含在数据缓存中?

3 个答案:

答案 0 :(得分:0)

  

指令缓存在程序的代码段上运行,数据缓存在程序的数据段上运行。这是对的吗?

不,CPU不了解细分市场。

指令缓存适用于所有执行访问,无论它们是在代码段内执行,还是在堆中作为动态创建的代码执行。

数据缓存适用于所有其他非执行访问。数据可以在数据段,堆中,甚至在代码段中作为常量。

答案 1 :(得分:0)

  

根据我的理解,指令缓存在程序的代码段上运行,数据缓存在程序的数据段上运行。这是对的吗?

     

从堆分配的内存是否没有缓存优势?堆内存访问是否包含在数据缓存中?

记忆是记忆。 CPU无法区分堆和数据之间的区别。

指令缓存通常只从程序计数器中的地址开始,然后获取下一个N字节。 CPU仍然无法判断它是代码段还是数据段。

答案 2 :(得分:0)

编写程序时,会将其转换为机器可读的二进制文件。当CPU执行指令时,它会获取该二进制文件,解码,它的含义然后执行。基本上这个二进制文件告诉CPU它必须执行什么指令。如果这个二进制文件只存储在主内存中,那么在每个获取阶段,CPU必须访问主内存,这真的很糟糕。相反,我们所做的是将其中一些存储在缓存中,更靠近CPU。由于此缓存仅包含与要执行的指令相关的二进制信息,因此我们将其称为指令缓存。现在说明需要数据才能运行。在您的高级代码中,您可能会有类似的东西 StructType const * aa[2] = { 0, 0 }; PerformFusionCycle( aa /* rest */ ); 将转换为与

类似的机器指令

arrayA[i] = (arrayB[i] + arrayC[i])

该指令存储在指令高速缓存中,但数据,即arrayA,arrayB和arrayC将存储在存储器的另一部分中。再次,每次执行该指令时访问主存储器都是无用的。因此,我们将其中的一部分存储在另一个缓存中,我们将其称为数据缓存。