mmap和new/malloc的区别

1. 操作系统层面:mmapmalloc 的本质区别

对比点mmap (我们用)malloc/new (C 库堆)
调用者你自己直接发系统调用先进入 glibc 分配器,再由它决定是否 brk / mmap
返回地址必定页对齐 (4 KB/2 MB…)只保证满足所请求的对齐(8 byte、16 byte…)
粒度任意「页数 × 4 KB」C 库按内部 chunk 机制切分,一般 < 1 MB
虚拟内存类型匿名私有映射 (MAP_PRIVATEMAP_ANONYMOUS)
真实物理占用按需分配 (Demand Paging)——首次写入触发缺页才分物理页
释放方式munmap(addr, size):直接返回内核,可立即被内核回收free(p):只是回到 glibc arena;是否归还内核取决于 glibc 策略

2. mmap 对内存池的“硬优点”

2.1 天生页对齐 —— 最适合 Span / Buddy 切分

  • 我们的 PageCache 以「页」为最小单位管理连续段 (Span)。

  • mmap 天然返回“页对齐”的首地址,避免自己再做对齐修正。

2.2 批量申请,减少系统调用

  • 一次 mmap(32 KB),后面可以从这 32 KB 切上千个 32 B 小块。

  • 如果用 malloc,C 库也会批量拿,但我们看不见内部策略,不可控

2.3 释放完全可控

  • 当 PageCache 判断某些空闲 span 长时间未被使用,就可以 munmap 立刻归还,降低 RSS。

  • free() 回 glibc 后是否 munmap,要等 glibc threshold;你的代码影响不了。

2.4 零初始化 & 安全

  • Linux 匿名页先映射到 “零页” 的 Copy‑on‑Write,第一次写入才分物理页 → 不浪费实际物理内存。

  • 你再 memset(0) 保证跨平台一致;也能消除潜在的信息泄漏。

2.5 规避 glibc arena 锁

  • 多线程下,glibc malloc 要竞争 main arena / tcache。

  • 我们直接 mmap 避开了这些锁,对大页分配速度始终如一。


3. 联系到你的项目:三层缓存的使命分工

PageCache (mmap / munmap)  ←  页级、稀疏但重量级
       ↑
CentralCache (spin‑lock)   ←  多线程共享、批量切块
       ↑
ThreadCache  (thread_local)←  线程私有、极致快速
  • PageCache:做“大块”(页)申请,一次 mmap,然后自己切分,不让 C 库插手。

  • CentralCache / ThreadCache:在自己层次做链表管理、小块切割,不需要再次系统调用。

  • 若最底层用 malloc,就相当于又交给 glibc 管理一个“堆中的堆”,会出现双重碎片化、锁竞争以及失去页级可控释放能力。


4. 细到字节:mmap 调用流程

  1. 内核 VMA 创建

    • mmap 通过 do_mmap 在进程页表插入一个 VMA(虚拟内存区域),标记 VM_ANON | VM_PRIVATE

  2. 页表条目是 空映射

    • 此时并未分配物理页,也不会占用 RSS,只是一段虚地址范围。

  3. 首次访问触发缺页异常

    • 内核分配真正物理页 → ZeroPage → 拷贝零 → Map。

  4. memset(0) 实质是触发全部页缺页

    • 你显式清零,会立刻 fault‑in 每页,确保随后的使用不再缺页。

  5. munmap

    • 删除 VMA,回收对应物理页,RSS 立即下降(可在 top 或 /proc/PID/smaps 看到)。


5. 面试/答辩时的“金句”总结

  • “PageCache 直接 mmap 匿名私有页,一次拿整块页对齐内存,避免进入 glibc 堆管理队列;这给了我们对页级切分、合并与回收的 100% 主动权。”

  • munmap 让内存池可以把闲置 span 即时退回内核,避免双重碎片,并降低进程常驻集大小。”

  • “对多线程来说,我们绕过 glibc arena 锁,保证大块分配 O(1) sys‑call 成本,线程伸缩稳定。”


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值