Linux 上的匿名内存是页面缓存的一部分吗?

Pet*_*ter 5 linux memory-management heap-memory linux-kernel

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

但是关于页面缓存的维基百科条目包含一个图形(请看右上角),它给我的印象是malloc()在页面缓存中分配动态内存:
Thomas Krenn 的 Linux 存储堆栈图

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

我希望得到一些解释。

谢谢。

编辑 2021-03-14
我决定最好在邮件列表上询问内存子系统的内核维护者。幸运的是,马修·威尔科克斯做出了回应并帮助了我。提炼:

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

可以在此处此处阅读讨论。

wxz*_*wxz 3

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


更新:更正答案以合并来自与 OP 的内核邮件列表讨论的新信息。


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

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

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

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

一个例外是具有特殊文件系统支持的匿名内存。例如,mmapIPC 进程之间的共享内存 d 由基于 ram 的tmpfs[ 6 ] 支持。该内存位于页面缓存中,但是匿名的,因为它没有磁盘备份文件 [pg.1]。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