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

Linux 4.6下MAP_PRIVATE标志的mmap内存提交限制追踪问题

Linux 4.6下MAP_PRIVATE类型mmap与系统提交限制的关系

内存分配时的追踪逻辑

Linux的系统提交限制由/proc/sys/vm/overcommit_memory等参数控制,对MAP_PRIVATE的mmap(2)调用的处理分两种情况:

  • 默认模式(overcommit_memory=0):内核会做启发式检查,但不会严格追踪整个mmap虚拟空间的大小。因为这类映射是写时复制(COW)的,初始阶段只是挂接共享的只读页,只有当进程实际写入页面时,才会分配物理页并计入已提交内存。内核只会估算进程可能用到的内存,不会把整个虚拟分配量都算进已提交额度。
  • 严格限制模式(overcommit_memory=2):此时内核会严格执行提交限制,MAP_PRIVATE的mmap虚拟空间会直接计入进程已用内存,申请时如果加上进程现有内存超过overcommit_ratio或overcommit_kbytes定义的阈值,mmap调用会直接失败。

内存换出时的约束情况

当MAP_PRIVATE的页面需要从RAM换出时,分两种场景:

  • 未被修改的COW页:内核直接丢弃这类页面,不会写入交换空间(swap)——因为它们和源文件里的内容完全一致,需要时可以重新从文件读取。这种情况不受swap空间大小的约束。
  • 已修改的私有脏页:这类页面是进程写入后生成的私有副本,换出时会被写入swap。此时会受swap可用空间的限制:如果swap不足,内核会触发OOM killer来回收内存,不会像Windows那样直接让进程崩溃。

和Windows页面文件节的差异

Windows的私有节(功能类似MAP_PRIVATE)在创建时就会预留页面文件空间,提交的内存直接对应页面文件的配额;而Linux的MAP_PRIVATE映射在未写入前不占用实际swap或物理内存,只有写入后的脏页才会占用swap资源,提交限制的逻辑和Windows的页面文件配额机制本质不同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:41:08