malloc / free是libc提供的系统调用还是库例程?

时间:2011-12-10 14:45:57

标签: c linux system-calls libc

如果在libc中将malloc / free实现为库例程,那么它是在 sbrk 系统调用还是 mmap 系统调用或其他内容上实现的?< / p>

一般情况下, sys / syscall.h 中声明的函数是否包含目标机器中的所有系统调用?

3 个答案:

答案 0 :(得分:29)

mallocfree经常使用较低级别的虚拟内存分配服务,并使用system calls mmap一次分配多个页面(甚至兆字节)和munmap(也许sbrk)。通常malloc更喜欢在相关时重用以前的 free内存空间。大多数malloc实现使用各种不同的策略进行“大”和“小”分配等等......

请注意,virtual address space可能会受到限制,例如与setrlimit(2)。在Linux pmap(1)proc(5)上使用以了解有关某个流程的虚拟地址空间的更多信息(例如/proc/self/maps为您自己的流程或/proc/1234/maps - 还有pmap 1234命令 - 用于进行pid 1234)。

您可以查看您的GNU libc源代码,查看其他C标准库的源代码(例如musl-libc),阅读malloc implementations,选择一些{{3}或者实现你自己的,或者使用other ones来实验。

阅读strace(即syscalls man page)和文件<asm/unistd.h>以获取系统调用列表。


非常快malloc

(我相信这可能是malloc最快的实现;但它不是很有用;它符合标准)

我坚信C标准对mallocfree非常模糊。我很确定以下功能是尊重标准的字母(但不是精神):

 /* politically incorrect, but very probably standard conforming */
 void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
 void free(void*ptr) { }

当然,您会相应地对callocrealloc进行编码。

(BTW每个使用malloc的代码都应该测试它的失败,但有些 - 不正确 - 不会; malloc可以在失败时返回NULL,人们应该测试那个案例)


GNU libc为您自己的malloc函数提供syscalls(2)(您甚至可以透明地使用hooks)。这些钩子可能会被弃用并且是非标准的。

如果使用GNU libc,请同时查看Boehm's Garbage Collectormallinfo(3)及相关函数。

答案 1 :(得分:6)

mallocfree是标准C库函数,由每个C实现实现。

C标准仅定义了这些函数的行为方式以及它们所期望的行为。如何在每个实现中实现它们。

简而言之,它们是您使用的实现的实现细节。

(“实现”包括编译器,链接器,运行时库以及其他一些东西。)

答案 2 :(得分:2)

如果使用不同的内存分配器,也可以对mallocfree使用备用实现。例如,hoard memory allocator有时用于提高多线程应用程序的性能。