调用 malloc 函数并不总是在内部调用 sbrk 函数?

Posted

技术标签:

【中文标题】调用 malloc 函数并不总是在内部调用 sbrk 函数?【英文标题】:calling malloc function does't always call sbrk function internally? 【发布时间】:2021-01-09 11:08:10 【问题描述】:

我是C和堆内存的新手,以下是我对动态内存分配的理解,如果我错了,请纠正我:

事实1-当第一次调用malloc时,malloc会在内部调用sbrk来移动/增长brk指针(程序中断)。

事实 2-在调用 mallocfree 几次之后,两个分配的块之间可能有空闲块,所以如果我们再次调用 malloc 所需的大小小于空闲块的大小,那么这一次malloc不会在内部调用sbrk,而是malloc 只需修改一个现有空闲块的结构(设置分配位...等)并返回该块的地址。

【问题讨论】:

简单的回答:是的。更复杂的答案:您的malloc 实现可能根本不使用brk/sbrk,至少有时可能会使用mmap @StaceyGirl 感谢您的回答。但是mmap 不一定将对象映射到堆区,不是吗?我可以使用mmap 将对象映射到任何合法区域。 mmap 可用作sbrk 的替代品,以从操作系统获取新内存。所谓的“堆区域”可以通过多种方式组织。 @StaceyGirl 是否在 mmap 内部移动/增长 brk? @amjad mmap 不一定将对象映射到堆区域“堆区域”是您的实现定义的任何内容。它可以是来自brk()/sbrk() 的内存,也可以是来自mmap() 的内存,甚至可以是 POSIX 或 SysV 共享内存或实现可用于为您的进程提供内存的任何其他机制。 【参考方案1】:

标准中没有任何内容表明malloc() 必须移动/增长 brk 指针以分配内存。其实现在malloc()内部经常会使用mmap(..., MAP_ANONYMOUS, ...)来获取内存。

如果在重复malloc()free() 调用后存在间隙,则下一个malloc() 可能能够在间隙中分配内存,这样就不会调用sbrk() 或@987654328 @是必要的。但同样,不能保证这真的会发生。

【讨论】:

感谢您的回答。所以当我们调用malloc如果没有可用的空闲块可以使用,而malloc内部使用mmap获取内存,所以在这种情况下,brk指针不能保持不变,它需要递增,不是吗? mmap 会在内部移动 brk 指针吗? mmap() 据我所知并没有移动 brk 指针。内核将跟踪分配给进程的(虚拟)页面的数量,无论是通过 brk 指针还是通过其他方式。

以上是关于调用 malloc 函数并不总是在内部调用 sbrk 函数?的主要内容,如果未能解决你的问题,请参考以下文章

malloc如何从堆中获取内存?

内部libc函数调用必须通过.plt

如何在内部调用快速导出方法?

PHP 的“未设置”构造如何在内部工作?

函数strdup()

一个类能否在内部监控其成员函数的使用和参数