You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mmap映射页是否始终可回收?文件页防驱逐及mlock有效性咨询

mmap文件映射页的内存驻留与缺页问题解答

1. 禁用swap后,预加载完成的映射页是否不会触发major fault、不会被驱逐?

  • 不行,别想当然。即使禁用了swap、完成了预加载,后续访问还是可能出现major fault,文件后备页也可能被内核驱逐。因为Linux内核的页回收机制不只是管swap相关的匿名页,只读的文件映射页也在回收范围内——当系统内存吃紧时,内核会优先回收这类“干净”的文件页(毕竟需要的时候可以直接从原文件重新加载,不用写回数据),跟swap开没开没关系。

2. 怎么防止文件后备页被驱逐?

  • mlock()系统调用或者mmap()时加MAP_LOCKED标志完全有效。这俩操作都会把指定的内存区域钉死在物理内存里,内核不能回收这些页,自然也就不会再有major fault。
    • 注意:用这俩方法需要CAP_IPC_LOCK权限,而且锁定的内存总量不能超系统限制,你可以查看/proc/sys/vm/max_lockable_memory的值调整。
    • 两者区别不大:MAP_LOCKED是在mmap创建映射时直接锁定,mlock()是给已经映射好的内存区域加锁,最终效果一致。

3. swapoff对文件后备页有啥影响?

  • swapoff -a只针对匿名页生效,也就是禁止匿名页被交换到swap分区,但对文件后备页的回收逻辑没有任何影响。内核该回收还是会回收只读文件页,因为这些页的内容有原文件做备份,根本不需要依赖swap。

内容的提问来源于stack exchange,提问作者song xs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:32:32