15

我是 UNIX 新手,我正在研究一些 UNIX 系统调用,例如brk(),sbrk()等....

昨天我读到了malloc()函数,我有点困惑!谁能告诉我为什么 malloc 减少了sbrk()程序必须执行的系统调用的数量?

还有一个问题, dobrk(0)sbrk(0)returnmalloc(0)相同的值?

4

4 回答 4

47

系统调用的处理成本很高,因为系统调用会产生额外的开销:您必须切换到内核模式。系统调用通过发出“陷阱”或中断进入内核。这是对内核的服务调用,因为它在内核地址空间中执行,所以切换到内核(然后切换回来)的开销很高。

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

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

brk用于将数据段的结尾设置为您指定的值。它说“将我的数据段的末尾设置为此地址”。当然,你指定的地址一定要合理,操作系统要有足够的内存,不能让它指向某个地方,否则会超过进程最大数据大小。因此,brk(0)无效,因为您试图将数据段的结尾设置为 address 0,这是无稽之谈。

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

malloc不是系统调用,它是一个 C 库函数,使用sbrk. 根据手册页,malloc(0)是有效的,但没有多大用处:

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

所以,不,,brk(0)sbrk(0)malloc(0)等价:第一个是无效的,第二个是用来获取程序break的地址,后者是没用的。

请记住,您不应该在整个程序中同时使用mallocbrk或。假设它完全控制了and ,如果你交换对and的调用,可能会发生非常奇怪的事情。sbrkmallocbrksbrkmallocbrk

于 2013-10-31T10:22:45.423 回答
12

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

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

于 2013-10-30T08:26:44.703 回答
1

malloc() 函数用于调用 sbrk 系统调用,在过程中动态创建内存。

malloc() 函数已在 stdlib.h 头文件中分配,因此 malloc 函数使用库函数递归调用所需的函数。

在 sbrk 的帮助下,我们需要显式声明一些东西来调用系统调用。

根据函数中给定的大小或通过系统调用返回变量并存储。

于 2013-10-30T08:13:59.627 回答
1

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.  
于 2013-10-30T08:45:19.450 回答