频繁访问文件映射内存

Frequently Accessing File Mapped Memory

频繁访问大型(1~2 GB)文件映射内存会导致性能下降吗? (在一个紧密的循环中,比如说,游戏的更新循环)

据我所知 google,内存映射文件由 OS 缓存(使用页面错误),这使得它看起来很安全,因为它已加载到内存中。

但是,我还认为由于它是缓存,而不是加载,它可能会导致性能下降。

请帮助我找到正确的答案,如有描述将不胜感激。如果可能的话,我想知道 Linux 和 Windows 的答案,但我怀疑他们的行为 that 不同。

注意:当我说 'access' 时,我指的是读和写。

您询问有关重复访问 1-2 GB 范围的 memory-mapped 文件的问题。简短的回答是肯定的,它会降低性能,特别是如果您的页面很小。

第一个问题是重复访问 1 GB 的任何内存(默认情况下)往往会驱逐您拥有的任何其他数据,并且 CPU 数据缓存命中率会受到影响。考虑到典型的 CPU 数据缓存大小只有几兆字节。

第二个问题是Translation Lookaside Buffer。如果您使用 4 KB 的默认页面大小,则 1 GB 为 250k 页。在 Linux 上,您应该启用 "huge pages" 以减少访问如此大的内存区域所施加的 TLB 负载。

第三个问题,你好像没测试过。测试对于这类事情非常重要。没有它,您将永远不知道自己遇到的是真正的问题还是只是假设的问题。

这主要是系统特定的。一个考虑因素是 OS 是否可以直接将内存映射到磁盘,或者是否需要一些中间转换。一些 OS/File 系统组合允许将映射文件完全视为页面文件(提供良好的性能和读取大文件的最快方式,尤其是当它在磁盘上连续时)。其他人没有。

I doubt they would behave that different.

它们实际上是完全不同的。 Windows 使用支持连续文件的硬文件系统。 Classic Unix 没有连续文件的概念