一般情况下,台式机有两种CPU缓存,可以更快地访问内存。
1)指令缓存 - >加快可执行指令。
2)数据缓存 - >加速数据获取和存储。
根据我的理解,指令缓存在程序的代码段上运行,数据缓存在程序的数据段上运行。这是对的吗?
从堆分配的内存是否没有缓存优势?堆内存访问是否包含在数据缓存中?
答案 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将存储在存储器的另一部分中。再次,每次执行该指令时访问主存储器都是无用的。因此,我们将其中的一部分存储在另一个缓存中,我们将其称为数据缓存。