1.11、为什么不全部使用mmap来分配内存?
不全部使用 mmap
来分配内存,主要基于性能和内存管理效率的权衡,具体原因如下:
- 1. 系统调用开销高:
mmap
分配内存必须通过系统调用进入内核态,再返回用户态,这种上下文切换开销较大。如果频繁使用mmap
,会导致大量系统调用,显著增加 CPU 负担。 - 2. 缺页中断频繁:
mmap
分配的内存是按页映射的,每次分配后虚拟地址对应的物理页尚未映射,首次访问时触发缺页中断,频繁的缺页中断会增加 CPU 负载,降低性能。 - 3. 内存释放即归还操作系统:
mmap
分配的内存释放时直接归还给操作系统,导致虚拟地址空间频繁变化,不利于内存复用和缓存,增加碎片和管理复杂度。 - 4. brk(堆扩展)方式的优势:
malloc
通过brk
系统调用预先申请一大块连续堆空间作为内存池,分配和释放时在用户态完成,减少系统调用次数和缺页中断,且能重用空闲内存块,提升小块内存分配效率。 - 5. 折中策略:现代
malloc
实现通常对小内存块使用brk
分配,避免频繁系统调用和缺页中断;对大块内存(如超过128KB)使用mmap
,利用其页对齐和直接映射优势,兼顾性能和灵活性。
总结来说,不全部用 mmap
是为了减少系统调用和缺页中断带来的性能损耗,同时利用 brk
的内存池机制提高小内存分配的效率和内存复用能力。这种混合策略是内存分配器设计的最佳,兼顾了性能、内存管理和系统资源利用。
获取账号,可以解锁所有文章,有兴趣的朋友可以私聊我。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1200
文章版权归作者所有,未经允许请勿转载。
THE END