brk和sbrk之间的区别

10

我是一名新手,能否有人用简单的例子告诉我brksbrk的确切区别?在这两者中选择有没有效率因素?mallocnew内部都调用brksbrk

2个回答

12
int brk(void *addr);
void *sbrk(intptr_t increment);

成功时,sbrk()返回以前的程序断点。(如果断点被增加,则该值是指向新分配内存开始的指针)。出错时,返回(void*)-1,并将errno设置为ENOMEM。

来自Linux手册页


8

brk 函数设置数据段的上限,sbrk 函数增加它。在古老的 Unix 系统中,malloc/free 使用 sbrk。在现代系统中,情况可能会大不相同,例如,OSX 不使用 brk/sbrk 来管理堆分配,而是使用 mmapbrk/sbrk 存在,但只是在内存的一个小段中进行模拟。这在 Linux 上几乎相同(提到了从 brk/sbrk 过渡到 mmap 的历史的源代码)。


感谢您的解释。我还有点困惑,当一个进程被创建时,数据段被固定到某个限制大小。假设数据段的大小为N,则brk可以将上限设置在N的范围内,或者brk可以将上限设置得大于N。如果sbrk增加了数据段的大小,那么堆分配发生在哪里?提前致谢。 - user3227126
上限是一个限制。一开始基本上没有堆,因此数据段被减少到最小值,您可以通过分配(brk/sbrk或其他方式)使其增长,但是只能增长到限制。您可以在某些系统上更改限制,但这不是brk/sbrk的目的。堆是数据段管理的方式(分配和空洞都在数据段中)。 - Jean-Baptiste Yunès

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接