为什么malloc从某个阈值开始依赖mmap?

rka*_*ach 5 linux malloc performance memory-management

我正在阅读关于malloc的一些内容,并在malloc的手册页中找到以下内容:

通常,malloc()从堆中分配内存,并使用sbrk(2)根据需要调整堆的大小.当分配大于MMAP_THRESHOLD字节的内存块时,glibc malloc()实现使用mmap(2)将内存分配为私有匿名映射.MMAP_THRESHOLD默认为128 kB,但可以使用mallopt(3)进行调整.使用mmap(2)执行的分配不受RLIMIT_DATA资源限制的影响(请参阅getrlimit(2)).

所以基本上从MMAP_THRESHOLD门户开始,malloc开始使用mmap.

  1. 有没有理由为大块切换到mmap?
  2. 这可能会影响流程执行性能吗?
  3. mmap系统是否会调用上下文切换?

Nem*_*emo 9

(1)通过匿名获取的页面mmap可以通过munmapglibc正在进行的操作发布.因此,对于小分配,free将内存返回到进程的堆(但将它们保留在进程的内存中); 对于大型分配,free将内存作为整体返回给系统.

(2)通过匿名获取的页面mmap在您第一次访问它们之前不会实际分配.此时,内核必须将它们归零以避免在进程之间泄漏信息.所以,是的,获取的页面mmap第一次访问的速度比通过进程堆回收的页面慢.您是否会注意到差异取决于您的申请.

不使用的成本mmap是释放的内存仍然由您的进程占用,并且对系统上的其他进程不可用.所以这最终是一种权衡.

(3)它不会"强制"上下文切换,我认为不太可能导致上下文切换.mmap实际上没有分配页面; 它只是操纵您的进程的页面映射.这通常应该是非阻塞操作.(虽然我承认我对此并不是100%肯定.)