Linux下大内存过度提交的mmap会立即创建大量页表项吗?
Linux中mmap大内存区域的页表项分配机制
不会立即创建全部2亿多个4KiB页对应的页表项,Linux靠多级页表的延迟分配+大页表项覆盖的机制来规避这个开销,具体逻辑如下:
- Linux采用多级页表结构(以x86_64为例,分为PGD、PUD、PMD、PTE四级),当你mmap出1TiB未使用的内存区域时,内核只会创建顶层的少数页表项(比如PGD、PUD、PMD级),这些高等级表项直接覆盖整个大地址范围,不会一次性生成所有对应4KiB页的PTE表项。
- 只有当你实际访问某个虚拟页时,才会触发缺页异常,此时内核才会为该页创建对应的PTE表项,并映射到共享零页。
- 此外,内核会自动尝试使用更大粒度的页表项(比如2MiB大页、1GiB巨页),单个大页表项就能覆盖远超4KiB的地址范围——比如一个1GiB的页表项可以替代26万多个4KiB的PTE,大幅降低页表的内存占用和簿记成本。
简单说就是:mmap大内存时,内核只搭好最上层的页表架子,底层细粒度的页表项等实际用到才创建,还会尽量用大页表项覆盖大范围地址,从根源上避免一开始就产生海量页表项的问题。
内容的提问来源于stack exchange,提问作者ajp
相关产品推荐
相关产品推荐

