GLIBC 如何决定 malloc 的段

How does GLIBC decide segment for malloc

提问人:Kokomelom 提问时间:1/19/2023 最后编辑:Kokomelom 更新时间:1/24/2023 访问量:104

问:

我查看了一些 Linux Glibc(2.25) 系统,发现当代码使用 .malloc

有时缓冲区已在堆段中分配,有时在匿名段中分配,这与大小无关,我可以看到/proc/PID/maps

我以为堆段与 和匿名段相关。但是为什么 GLIBC 决定使用相同的大小,有时使用mallocmmapmallocmmap

我看到有时当我在某些线程中使用时,内存已在堆段分配,但是当我切换到另一个线程(使用 GDB)时,内存已分配给匿名段malloc

gdb malloc 堆内存 glibc mmap

评论


答:

0赞 Chris Dodd 1/20/2023 #1

glibc 的实现有时会使用 or(你称之为堆 - 它在 /proc/PID/maps 中显示为“堆”),有时使用 .这取决于一些权衡,但一般来说mallocbrksbrkmmap

  • 如果进程只需要少量的堆空间,则 BRK/SBRK 更好

  • 如果一个进程需要大量的堆空间和/或非常大的块,那么 mmap 会更好。

因此,GLIBC 的 malloc 实现有一堆启发式方法来决定什么是“小”,什么是“大”,并查看到目前为止对 malloc/free 的调用,以便决定使用哪种方法在需要时从系统获取更多内存。

你可以调用一个函数来影响这种调整 -- 手册页上有一堆关于它的信息。mallopt

评论

0赞 Kokomelom 1/20/2023
但是我通过 GDB 使用,在某些线程中,缓冲区已在堆段中分配,而在另一个线程(同一进程)中,缓冲区已在匿名段中分配。我俩都分配了相同的尺寸!malloc