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

标签 linux performance memory-management malloc

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

Normally, malloc() allocates memory from the heap, and adjusts the size of the heap as required, using sbrk(2). When allocating blocks of memory larger than MMAP_THRESHOLD bytes, the glibc malloc() implementation allocates the memory as a private anonymous mapping using mmap(2). MMAP_THRESHOLD is 128 kB by default, but is adjustable using mallopt(3). Allocations performed using mmap(2) are unaffected by the RLIMIT_DATA resource limit (see getrlimit(2)).

所以基本上从阈值 MMAP_THRESHOLD malloc 开始使用 mmap

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

最佳答案

(1) 通过匿名mmap获取的页面可以通过munmap释放,glibc就是这样做的。因此对于小的分配,free 将内存返回到进程的堆中(但将它们保留在进程的内存中);对于大型分配,free 将内存作为一个整体返回给系统。

(2) 通过匿名mmap 获取的页面直到您第一次访问它们时才真正分配。那时,内核必须将它们归零以避免在进程之间泄漏信息。所以,是的,通过 mmap 获取的页面在第一次访问时比通过进程堆回收的页面慢。您是否会注意到差异取决于您的应用。

不使用 mmap 的代价是释放的内存仍然被您的进程占用,系统上的其他进程无法使用。所以这最终是一种权衡。

(3) 它不会“强制”上下文切换,而且我认为不太可能导致上下文切换。 mmap 实际上并不分配页面;它只是为您的流程操纵页面映射。这通常应该是一个非阻塞操作。 (虽然我承认我对此不是 100% 确定。)

关于linux - 为什么malloc依赖mmap从某个阈值开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33128587/

相关文章:

regex - 如何将 grep 与文件中的正则表达式和模式一起使用?

java - 如何在低优先级的 Android/Java 上执行 Linux 命令?

c - C语言中的分配

iphone - 任何用于查找 ipad 内存使用情况的应用程序

java - 计算两个集合之间的交集最有效的方法是什么(Java)?

java - Java 32位系统int[]数组的内存大小

python - 在 linux 任务栏中创建一个 python 小程序

linux - 将最繁忙进程的 PID 存储在变量中

java - for 循环与 if-else 语句中的代码

python - 在优化的同时保持代码可读性