我是个新手,有人能用一个简单的例子说出brk和sbrk之间的确切区别吗?是否有效率因素可供选择?malloc和new在内部调用brk或sbrk。
发布于 2016-05-21 14:11:07
int brk(void *addr);addr brk()将数据段的末尾设置为
指定的值,当该值合理时,系统有足够的内存,并且进程不会超过其最大数据大小。
如果成功,brk()返回零。出错时,返回-1,并将errno设置为ENOMEM。
void *sbrk(intptr_t increment);sbrk()以字节为单位递增程序的数据空间。可以使用增量为0的调用sbrk()来查找程序中断的当前位置。
如果成功,sbrk()将返回前一个程序中断。(如果中断增加,则此值是指向新分配内存的开始的指针)。出错时,返回(void *) -1,并将errno设置为ENOMEM。
From linux manual page
发布于 2016-05-21 14:52:13
brk设置数据段的上限,sbrk递增它。在古老的Unixes中,malloc/free使用sbrk。在现代操作系统上,事情可能会有很大的不同,例如,OSX不使用brk/sbrk来管理堆分配,但mmap,brk/sbrk存在,但只是在一小段内存中模拟。这在Linux上几乎是一样的(源代码提到了从brk/sbrk到mmap的转换历史)。
https://stackoverflow.com/questions/37359498
复制相似问题