【问题标题】:Is anonymous memory part of the page cache on Linux?匿名内存是 Linux 上页面缓存的一部分吗?
【发布时间】:2021-06-09 17:31:07
【问题描述】:

anonymous memory - 即程序堆和堆栈 - 是 Linux 上页面缓存的一部分吗?内核的链接文档没有说明这一点。

但是关于Page Cache 的维基百科条目包含一个图形(看右上角),这给我的印象是malloc() 在页面缓存中分配动态内存:

这有意义吗?关于mmap(),当它用于访问文件时,使用页面缓存是有意义的。通常也用于匿名内存,例如malloc() 和通过mmap() 的匿名映射?

我将不胜感激。

谢谢。

编辑 2021-03-14
我决定最好在他们的mailing-list 上询问内存子系统的内核维护人员。幸运的是Matthew Wilcox 回复并帮助了我。摘录:

  • page cache 不处理匿名内存。
  • 匿名页面有多种不同的处理方式——可以在LRU lists(最近最少使用)上找到它们,也可以通过page tables找到它们。有点临时。
  • 维基百科图表有误。它还包含更多缺陷。
  • 如果系统提供交换并且匿名内存被交换 - 它进入swap cache,而不是page cache

可以在herehere 阅读讨论。

【问题讨论】:

  • 匿名内存由交换区支持,而不是文件系统。除此之外,它与任何其他虚拟内存基本相同。
  • 我投票结束这个问题,因为这不是一个编程问题。似乎更适合Computer Science
  • 我不同意 Barmar 的观点。该问题专门针对 Linux,完整的答案将包括 Linux 内核编程材料/参考。 Linux 标签甚至不存在于计算机科学中。此外,链接的计算机科学标签中只有数百个关注者,但仅 Linux 标签就有 164k 关注者。希望这个问题保持开放,因为有人更有可能在这里回答。
  • 我知道过度规范化是一个问题。我自己对这里的类似网站数量和重叠范围感到困惑。无论如何-我试图得到答案:)
  • CS 已关闭问题并建议其他站点,即 SO。我删除了自己的投票以结束 SO,并希望有人在这里回答。我希望有疑问的问题能在更广泛的网站上被接受并争取知识。

标签: linux memory-management linux-kernel heap-memory


【解决方案1】:

TLDR:不,除了具有特殊文件系统支持的匿名内存(如 IPC shmem)。


更新:更正答案以将来自kernel mailing list discussion 的新信息与 OP 合并。


页面缓存最初的目的是作为操作系统级别的内存区域,用于快速查找磁盘支持的文件,其原始形式是缓冲区缓存(用于缓存磁盘中的块)。页面缓存的概念出现在 1995 年晚些时候 Linux 诞生之后,但前提是相似的,只是一个新的抽象——页面 [1]。 事实上,最终两个缓存合而为一:页缓存包括缓冲区缓存,或者更确切地说,缓冲区缓存就是页缓存[1,2]。

那么页面缓存中的内容是什么?除了传统的磁盘支持文件之外,为了使页面缓存尽可能通用,Linux 提供了一些不符合传统磁盘支持页面概念的页面类型示例,但仍存储在页面缓存。当然,如前所述,缓冲区缓存(与页面缓存相同)用于存储磁盘支持的数据块。块不一定与页面大小相同。事实上,我了解到它们可以小于页面 [pg.323 of 3]。在这种情况下,被视为缓冲区高速缓存一部分的页面可能由多个块组成,这些块对应于磁盘上的非连续内存区域。那么,我不清楚缓冲区缓存中的每个页面是否必须是页面和文件之间的一对一映射,或者一个页面是否可以包含来自不同文件的块。尽管如此,这是一种不符合原始页面缓存最严格定义的页面缓存用法。

接下来是交换缓存。正如 Barmar 在 cmets 中提到的,可以将匿名(非文件支持的页面)换出到磁盘。在到磁盘和返回的过程中,页面被放入交换缓存中。交换缓存重新利用与页面缓存相似的数据结构,特别是 address_space 结构,尽管设置了交换标志和一些其他差异 [pg. 731 of 4, 5] 但是,由于交换缓存被认为与页面缓存分开,因此交换缓存中的匿名页面不被视为“在页面缓存中”。

最后:关于mmap/malloc是否在页面缓存中分配内存的问题。正如 [5] 中所讨论的,通常,mmap 使用来自空闲页面列表的内存,而不是页面缓存(除非没有剩余的空闲页面,我假设)。当使用mmap 映射文件以进行读写时,这些页面最终会驻留在页面缓存中。但是,对于匿名内存,mmap/mallocd 页通常不会驻留在页缓存中。

一个例外是具有特殊文件系统支持的匿名内存。例如,IPC 进程之间的共享内存mmapd 由基于内存的tmpfs [6] 支持。该内存位于页面缓存中,但它是匿名的,因为它没有磁盘支持文件 [pg. 600 个4]。

来源:

  1. https://lwn.net/Articles/712467/
  2. https://www.thomas-krenn.com/en/wiki/Linux_Page_Cache_Basics
  3. https://www.doc-developpement-durable.org/file/Projets-informatiques/cours-&-manuels-informatiques/Linux/Linux%20Kernel%20Development,%203rd%20Edition.pdf
  4. https://doc.lagout.org/operating%20system%20/linux/Understanding%20Linux%20Kernel.pdf
  5. https://lore.kernel.org/linux-mm/20210315000738.GR2577561@casper.infradead.org/
  6. https://github.com/torvalds/linux/blob/master/Documentation/filesystems/tmpfs.rst

【讨论】:

  • 这听起来像是堆栈内存无法换出 - 但肯定可以。
  • 我认为你是对的,在我看来,当我写堆栈时,我正在考虑非交换页面缓存,就像 mmap/malloc 的情况一样。
  • 请阅读我的问题的编辑。恐怕-关于匿名内存(堆栈和堆),您的答案不正确。我不想在这里回答我自己的问题,因为 Matthew Wilcox 确实这样做了。
  • @Peter 感谢您尝试从内核邮件列表中获取最新答案。我有兴趣进一步探索这一点。如果你不介意,我会跳上电子邮件链。
  • 干得好。我们获得了知识并结识了乐于助人的人!我不熟悉 Wikipedia 的内部结构,但我从“页面缓存”条目中删除了图表,现在正在研究如何最好地处理包含图表的其他条目。
猜你喜欢
  • 1970-01-01
  • 2011-01-06
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2012-11-08
  • 1970-01-01
  • 2013-09-19
相关资源
最近更新 更多