我知道:
虚拟内存分为用户空间和内核空间,并映射到物理内存。当用户进程访问文件时,内核将在授予进程访问权限(页面缓存)之前将该文件缓存到内存中。
然而
页面缓存的内存空间会受到内核空间的限制吗?或者除了linux中的配置之外,还有哪些东西会限制页面缓存大小?
我知道:
虚拟内存分为用户空间和内核空间,并映射到物理内存。当用户进程访问文件时,内核将在授予进程访问权限(页面缓存)之前将该文件缓存到内存中。
然而
页面缓存的内存空间会受到内核空间的限制吗?或者除了linux中的配置之外,还有哪些东西会限制页面缓存大小?
页面缓存存储在 RAM 中。原则上,它可以填满整个物理内存。它没有的原因是内存也用于其他目的。
“匿名”(交换支持)内存分配与页面缓存的文件支持分配竞争。两者通过内存管理代码来平衡。内存管理的确切行为非常复杂。当没有空闲 RAM 用于分配新页面时,Linux 将选择是驱逐旧的交换支持页面还是旧的文件支持页面。可以使用
vm.swappiness
配置值调整此选择的平衡。Linux 支持的一些体系结构缺乏虚拟地址空间(只有 32 位甚至 31 位 :-)。这不会限制页面缓存的大小。页面缓存被显式写入以支持使用临时虚拟映射。查看主要来源:https ://www.kernel.org/doc/html/latest/vm/highmem.html
内存的其他用途是
不可撤销的非缓存分配。例如内核代码。这些分配还包括使用 进行的内核分配
kmalloc()
,它们(大部分?)显示为“slab”分配。还有其他类型。内核网络缓冲区是一个整体上会变得非常大的不可撤销内存分配的示例。
“水印”记忆。这是保留的,以便在压力下在内存管理方面取得进展。例如,我相信当达到水印时可能会使用这些保留,并且需要一些内存来写入旧的匿名页面以进行交换,以便为其他内容腾出空间。通常,保留可能是内存的 1-3%(在更大的系统上更少)。 我系统上的“水印”内存预留有多大? 这在小型系统上可能显示为 3% 的原因与“透明大页面”有关。