malloc()和sbrk()如何在unix中运行?

arz*_*ade 11 unix malloc

我是新来的UNIX,并且我学习了一些UNIX系统调用,如brk(),sbrk()等....

最后一天我读到了关于malloc()功能的内容,我感到很困惑!任何人都可以告诉我为什么malloc减少sbrk()了程序必须执行的系统调用次数?

另一个问题,做brk(0),sbrk(0)malloc(0)返回相同的价值?

Fil*_*ves 39

由于系统调用所带来的额外开销,Syscalls的处理成本很高:您必须切换到内核模式.系统调用通过发出"陷阱"或中断进入内核.它是对内核的一个服务调用,并且因为它在内核地址空间中执行,所以它具有高开销到内核(然后切换回).

这就是为什么malloc减少调用sbrk()和的次数的原因brk().它通过请求比你要求更多的内存来实现这一点,因此每次需要更多内存时都不必发出系统调用.

brk()并且sbrk()是不同的.

brk用于将数据段的结尾设置为您指定的值.它说"将我的数据段的末尾设置为此地址".当然,您指定的地址必须合理,操作系统必须有足够的内存,并且您不能指向某个超出进程最大数据大小的地方.因此,brk(0)无效,因为您试图将数据段的末尾设置为地址0,这是无稽之谈.

另一方面,将数据段大小sbrk 增加指定的量,并返回指向上一个中断值的指针.sbrk使用0 调用有效; 它是一种获取指向当前数据段中断地址的指针的方法.

malloc它不是系统调用,它是一个使用C管理内存的C库函数sbrk.根据联机帮助页,malloc(0)有效,但没有多大用处:

如果size为0,则malloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.

所以,不,brk(0),sbrk(0)malloc(0)不是等价的:第一他们是无效的,二是用于获取程序的破发地址,而后者是无用的.

请记住,您不应该同时使用malloc和/ brksbrk整个程序.malloc假设它有完全控制brksbrk,如果您交换到电话mallocbrk,非常奇怪的事情都可能发生.


tri*_*tan 9

为什么malloc减少了程序必须执行的sbrk()系统调用的数量?

例如,如果您调用malloc()来请求10个字节的内存,则该实现可能会使用sbrk(或其他系统调用,例如mmap)从OS请求4K字节。然后,当您下次调用malloc()来请求另外10个字节时,它不必发出系统调用;它可能只返回上一次4K系统调用分配的内存。