调用 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-在调用 malloc
和 free
几次之后,两个分配的块之间可能有空闲块,所以如果我们再次调用 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 函数?的主要内容,如果未能解决你的问题,请参考以下文章