Is 匿名记忆- 即程序堆和堆栈 - Linux 上页面缓存的一部分?内核的链接文档没有说明这一点。
But the Wikipedia entry about Page Cache contains a graphic (look at the top right) which gives me the impression that malloc() allocates dynamic memory within the page cache:
那有意义吗?关于mmap()
,当它用于访问文件时,使用页面缓存是有意义的。通常也用于匿名内存,例如malloc()
和匿名映射通过mmap()
?
我希望得到一些解释。
谢谢。
编辑2021-03-14
我决定最好向内存子系统的内核维护者询问他们的情况邮件列表。幸运的是马修·威尔考克斯回应并帮助我。提炼:
- 匿名内存不由
page cache
.
- 匿名页面有多种不同的处理方式——可以在
LRU lists
(最近最少使用),可以通过page tables
。有点临时的。
- 维基百科的图表是错误的。它还包含更多缺陷。
- 如果系统提供交换并且匿名内存被交换 - 它会进入
swap cache
,不是page cache
.
讨论可以继续阅读here or here.
TLDR:不,除了具有特殊文件系统支持的匿名内存(如 IPC shmem)。
Update:更正答案以纳入新信息内核邮件列表讨论与OP。
页缓存最初旨在成为操作系统级内存区域,用于快速查找磁盘支持的文件,其原始形式是缓冲区缓存(旨在缓存磁盘中的块)。页缓存的概念是在 1995 年 Linux 诞生后出现的,但前提是相似的,只是一个新的抽象——页 [1]。
事实上,最终这两个缓存合二为一:页缓存包含了缓冲区缓存,或者更确切地说,缓冲区缓存就是页缓存[1, 2].
那么页面缓存中存放了什么?除了传统的磁盘支持的文件之外,为了使页面缓存尽可能通用,Linux 有一些页面类型的示例,它们不遵守磁盘支持的页面的传统概念,但仍然存储在页面缓存。当然,如上所述,缓冲区高速缓存(与页高速缓存相同)用于存储磁盘支持的数据块。块的大小不一定与页的大小相同。事实上,我了解到它们可以小于页面 [第 323 页3]。在这种情况下,被视为缓冲区高速缓存一部分的页面可能由与磁盘上不连续内存区域相对应的多个块组成。那么,我不清楚缓冲区高速缓存中的每个页面是否必须是页面和文件之间的一对一映射,或者一个页面是否可以由来自不同文件的块组成。尽管如此,这是一种页面缓存使用方式,不符合原始页面缓存的最严格定义。
接下来是交换缓存。正如 Barmar 在评论中提到的,匿名(非文件支持的页面)可以交换到磁盘。在磁盘和返回的过程中,页面被放入交换缓存中。交换缓存重新利用了与页面缓存类似的数据结构,特别是address_space
struct,尽管设置了交换标志和一些其他差异[pg.1]。 731 的4, 5] 但是,由于交换缓存被视为与页面缓存分离,因此交换缓存中的匿名页面不被视为“在页面缓存中”。
最后:关于是否的问题mmap
/malloc
正在页面缓存中分配内存。正如[5], 通常,mmap
使用来自空闲页面列表的内存,而不是页面缓存(我认为除非没有剩余的空闲页面)。使用时mmap
为了映射文件以进行读写,这些页面最终会驻留在页面缓存中。然而,对于匿名记忆,mmap
/malloc
d 页通常不驻留在页缓存中。
一个例外是具有特殊文件系统支持的匿名内存。例如,共享内存mmap
d 进程之间的 IPC 由基于 ram 的支持tmpfs
[6]。该内存位于页面缓存中,但是匿名的,因为它没有磁盘备份文件 [pg.1]。 600 的4].
Sources:
- https://lwn.net/Articles/712467/
- https://www.thomas-krenn.com/en/wiki/Linux_Page_Cache_Basics
- https://doc.lagout.org/operating%20system%20/linux/Understanding%20Linux%20Kernel.pdf
- https://lore.kernel.org/linux-mm/[电子邮件受保护]/
- https://github.com/torvalds/linux/blob/master/Documentation/filesystems/tmpfs.rst
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)