我是 UNIX 新手,我正在研究一些 UNIX 系统调用,例如brk()
,sbrk()
等....
昨天我读到了malloc()
函数,我有点困惑!谁能告诉我为什么 malloc 减少了sbrk()
程序必须执行的系统调用的数量?
还有一个问题, dobrk(0)
和sbrk(0)
returnmalloc(0)
相同的值?
系统调用的处理成本很高,因为系统调用会产生额外的开销:您必须切换到内核模式。系统调用通过发出“陷阱”或中断进入内核。这是对内核的服务调用,因为它在内核地址空间中执行,所以切换到内核(然后切换回来)的开销很高。
这就是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的地址,后者是没用的。
请记住,您不应该在整个程序中同时使用malloc
和brk
或。假设它完全控制了and ,如果你交换对and的调用,可能会发生非常奇怪的事情。sbrk
malloc
brk
sbrk
malloc
brk
为什么 malloc 减少了程序必须执行的 sbrk() 系统调用的数量?
比如说,如果你调用 malloc() 来请求 10 字节的内存,则实现可能会使用 sbrk(或其他系统调用,如 mmap)从操作系统请求 4K 字节。然后当你下次调用 malloc() 请求另外 10 个字节时,它不必发出系统调用;它可能只是返回最后一次 4K 的系统调用分配的一些内存。
malloc() 函数用于调用 sbrk 系统调用,在过程中动态创建内存。
malloc() 函数已在 stdlib.h 头文件中分配,因此 malloc 函数使用库函数递归调用所需的函数。
在 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.