C语言中的缓存内存

3

有没有办法找出我请求的内存是否被缓存?如果是这样,知道该内存块存储在哪个级别的缓存中将会很有帮助。

我曾经想过当指针被缓存时其地址可能会改变,但似乎行不通。

编辑:这是为大学项目而做的,我可以访问多台具有不同操作系统的机器,因此几乎任何解决方案都会有所帮助。


{btsdaf} - user694733
1
{btsdaf} - user2371524
2
{btsdaf} - Jabberwocky
2
{btsdaf} - Ctx
3
询问某个东西是否在缓存中毫无意义,因为在您对其进行任何处理之前,答案就已经过时了。有些事情超出了您的控制范围,可以改变缓存的状态,包括运行用于查找缓存中是否存在某个东西的代码。 - Art
显示剩余2条评论
2个回答

5
我认为指针的地址可能会在缓存时发生变化,但事实上并非如此。您可能误解了缓存的工作原理。缓存是单独的内存,它有自己的地址,但当CPU从RAM缓存内存行时,它会记录内存所在的RAM地址,并保留RAM地址和缓存地址之间的映射关系。从程序的角度来看,地址是相同的。如果程序需要一个地址,并且CPU在映射中看到该地址(缓存命中),CPU会即时翻译地址,并从缓存而不是RAM获取数据。
从高级语言(如C)的角度来看,没有一种方法可以确定您请求的内存是否已被缓存。操作系统理论上可以找出地址是否被缓存,但这并不是您可以依靠C语言的任何内容。
请参见Can i check if a chunk of memory (e.g., allocated using malloc) stays in the cache?

{btsdaf} - Dominik Pastierovič
{btsdaf} - Hans Petter Taugbøl Kragset
值得注意的是,C语言并没有提供任何标准方法来做到这一点。然而,这并不妨碍操作系统使用一些系统调用或其他类似于平台相关的方式来获取这些数据,甚至可以通过嵌入汇编来实现。关键在于没有一种平台无关的方法来做到这一点;如果你想要实现,你需要弄清楚你的CPU是否支持,并且如果支持的话,如何使用这些信息构建一个平台相关的方法。 - anon

0

如果您已经请求了任何内存块,那么肯定已经被缓存了。

当请求任何内存地址时,首先会在第一级缓存中进行检查,如果失败,则会在第二级缓存中进行检查,以此类推。

一旦找到该地址所属的块,整个块将被放置在缓存的第一级中,根据局部性原理,以避免对相同块的额外搜索(例如,如果您访问相同的地址或连续的地址),这在几乎每个程序中都很常见(例如,用于循环、索引等)。


{btsdaf} - dbrank0
1
@dbrank0 是的,但是替换策略决定了已缓存的块将被删除以便放置新的块。每当您尝试访问一个内存块时,它将被复制到缓存内存中。如果没有或者只有选择性地进行复制,那么内存层次结构将无法按预期工作。 - alseether
{btsdaf} - dbrank0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接