如果在libc中将malloc / free实现为库例程,那么它是在 sbrk 系统调用还是 mmap 系统调用或其他内容上实现的?< / p>
一般情况下, sys / syscall.h 中声明的函数是否包含目标机器中的所有系统调用?
答案 0 :(得分:29)
malloc
和free
经常使用较低级别的虚拟内存分配服务,并使用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标准对malloc
和free
非常模糊。我很确定以下功能是尊重标准的字母(但不是精神):
/* politically incorrect, but very probably standard conforming */
void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }
void free(void*ptr) { }
当然,您会相应地对calloc
和realloc
进行编码。
(BTW每个使用malloc
的代码都应该测试它的失败,但有些 - 不正确 - 不会; malloc
可以在失败时返回NULL
,人们应该测试那个案例)
GNU libc为您自己的malloc
函数提供syscalls(2)(您甚至可以透明地使用hooks)。这些钩子可能会被弃用并且是非标准的。
如果使用GNU libc,请同时查看Boehm's Garbage Collector和mallinfo(3)及相关函数。
答案 1 :(得分:6)
malloc
和free
是标准C库函数,由每个C实现实现。
C标准仅定义了这些函数的行为方式以及它们所期望的行为。如何在每个实现中实现它们。
简而言之,它们是您使用的实现的实现细节。
(“实现”包括编译器,链接器,运行时库以及其他一些东西。)
答案 2 :(得分:2)
如果使用不同的内存分配器,也可以对malloc
和free
使用备用实现。例如,hoard memory allocator有时用于提高多线程应用程序的性能。