brk和sbrk之间的区别

时间:2016-05-21 06:06:00

标签: c unix

我是新手,可以用一个简短的例子告诉brksbrk之间的确切区别吗?是否有任何效率因素可供选择? mallocnew内部呼叫brksbrk

2 个答案:

答案 0 :(得分:6)

int brk(void *addr);
  

brk()将数据段的结尾设置为指定的值          addr,当该值合理时,系统有足够的内存,          并且该过程不超过其最大数据大小。

     

成功时,brk()返回零。出错时,返回-1,并返回错误          设置为ENOMEM。

void *sbrk(intptr_t increment);
  

sbrk()按递增字节递增程序的数据空间。          调用增量为0的sbrk()可用于查找当前值          程序中断的位置。

     

成功时,sbrk()返回上一个程序中断。 (如果休息          增加了,那么这个值是指向新开始的指针          分配内存)。出错,返回(void *) - 1,错误是          设为ENOMEM。

From linux manual page

答案 1 :(得分:2)

brk设置数据段的上限,sbrk递增它。在古代Unix malloc/free中使用sbrk。在现代的情况下,事情可能会有很大不同,例如,OSX不使用brk/sbrk来管理堆分配,但mmapbrk/sbrk存在,但只是在一小段内存中进行仿真。这在Linux上几乎相同(提及从brk / sbrk到mmap的过渡历史的源代码)。