我是UNIX的新手,正在学习一些UNIX系统调用,例如brk()
、sbrk()
等...
昨天我读到了malloc()
函数,并且有点困惑!有人能告诉我为什么malloc()
会减少程序必须执行的sbrk()
系统调用次数吗?
还有一个问题,brk(0)
、sbrk(0)
和malloc(0)
返回相同的值吗?
malloc
减少了对sbrk()
和brk()
的调用次数。它通过请求比您请求的内存更多的内存来实现,这样每次需要更多内存时就不必发出系统调用了。
brk()
和sbrk()
是不同的。
brk
用于将数据段的结尾设置为指定值。它表示“将我的数据段的结尾设置为此地址”。当然,您指定的地址必须是合理的,操作系统必须有足够的内存,而且您不能使其指向会超过进程最大数据大小的地方。因此,brk(0)
无效,因为您将尝试将数据段的结尾设置为地址0
,这是不合理的。sbrk
按您指定的数量递增数据段的大小,并返回先前的断点值的指针。使用0调用sbrk
是有效的;这是获得当前数据段断点地址的一种方式。
malloc
不是系统调用,它是一个使用sbrk
管理内存的C库函数。根据手册,malloc(0)
是有效的,但没有太多用途:因此,brk(0)
、sbrk(0)
和malloc(0)
并不相等:第一个是无效的,第二个用于获取程序断点的地址,而最后一个则没有用处。
请记住,在整个程序中不应该同时使用malloc
和brk
或sbrk
。如果你交替调用malloc
和brk
,非常奇怪的事情可能会发生,因为malloc
假定它完全控制了brk
和sbrk
。
sbrk()
函数通过指定的字节数增加程序数据段分配。
malloc(4096); // sbrk += 4096 Bytes
free(); // freeing memory will not bring down the sbrk by 4096 Bytes
malloc(4096); // malloc'ing again will not increase the sbrk and it will use
the existing space which not result in sbrk() call.
malloc()函数用于调用sbrk系统调用,以在进程期间动态创建内存。
malloc()函数已经分配在stdlib.h头文件中,因此根据所需的函数,使用库函数递归地调用malloc函数。
借助sbrk,我们需要显式声明一些内容来调用系统调用。
根据函数或系统调用中给定的大小,它将返回变量并存储。
brk
返回一个int值,而sbrk
返回一个void指针,所以我认为不行。 - Mithrandir