一般来说,台式机有两种CPU缓存,以加快内存访问速度。
1)指令缓存->,用于加速可执行指令。
2)数据缓存->,用于加速数据的获取和存储。
根据我的理解,指令cache操作在程序的代码段上,数据cache操作在程序的数据段上。是这样的吗?
从堆分配的内存没有缓存优势吗?堆内存访问是否包含在数据缓存中?
发布于 2017-02-14 05:05:31
指令缓存对程序的代码段进行操作,数据缓存对程序的数据段进行操作。是这样的吗?
不,CPU不知道数据段。
指令缓存用于所有执行访问,无论它们是在代码段内执行,还是在堆中作为动态创建的代码执行。
数据缓存用于所有其他非执行访问。数据可以是数据段、堆,甚至是代码段中的常量。
发布于 2017-02-14 07:31:38
根据我的理解,指令缓存操作在程序的代码段上,数据缓存操作在程序的数据段上。是这样的吗?
从堆分配的内存没有缓存优势吗?堆内存访问是否包含在数据缓存中?
记忆就是记忆。CPU无法区分堆和数据。
指令高速缓存通常只从程序计数器中的地址开始,并抓取下N个字节。CPU仍然不能区分它是代码段还是数据段。
发布于 2017-02-15 22:57:33
当你编写一个程序时,它会被翻译成机器可读的二进制代码。当CPU执行指令时,它获取这个二进制文件,解码它的含义,然后执行。基本上,这个二进制文件告诉CPU它必须执行哪些指令。如果这个二进制文件只存储在主内存中,那么在每个获取阶段,CPU必须访问主内存,这真的很糟糕。相反,我们所做的是将其中一些数据存储在离CPU更近的缓存中。由于这种高速缓存只包含与要执行的指令相关的二进制信息,因此我们称之为指令高速缓存。现在,指令需要数据才能运行。在您的高级代码中,您可能有类似arrayA[i] = (arrayB[i] + arrayC[i])的代码,它将转换为机器指令,类似于
ADD memLocationStoredInRegisterA, memLocationStoredInRegisterB, memLocationStoredInRegisterC
此指令存储在指令高速缓存中,但数据,即arrayA、arrayB和arrayC将存储在内存的另一部分中。同样,每次执行这条指令时,访问主存都是无用的。因此,我们将其中的一部分存储在另一个缓存中,我们称之为数据缓存。
https://stackoverflow.com/questions/42204782
复制相似问题