为了账号安全,请及时绑定邮箱和手机立即绑定

malloc / free是libc提供的syscall还是库例程?

/ 猿问

malloc / free是libc提供的syscall还是库例程?

春华秋衣 2019-12-05 15:11:49

如果malloc / free是作为libc中的库例程实现的,那么它是在sbrk syscall还是mmap syscall或其他东西之上实现的呢?

通常,sys / syscall.h中声明的函数是否包含目标计算机中的所有系统调用?


查看完整描述

3 回答

?
潇湘沐

malloc和free是标准C库函数,其是由每个C实现来实现。


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


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


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


查看完整回答
反对 回复 2019-12-05
?
慕码人8056858

很多时候,malloc并且free正在使用较低级别的虚拟内存分配服务,并使用诸如mmap和munmap(甚至可能是sbrk)之类的系统调用一次分配多个页面(甚至兆字节)。相关时,通常倾向于重用以前的 d存储空间。大多数实现对“大”和“小”分配使用各种不同的策略,等等。malloc freemalloc


注意,可以限制虚拟地址空间,例如使用setrlimit(2)。在Linux pmap(1)和proc(5)上使用,以了解有关某个进程的虚拟地址空间的更多信息(例如,/proc/self/maps对于您自己的进程,或者/proc/1234/maps-对于pmap 1234命令-对于pid 1234的进程)。


您可以查看GNU libc源代码,其他C标准库的源代码(例如musl-libc),了解malloc实现,选择其他实现或自己实现,或者使用strace进行实验性查找。


阅读syscalls手册页(即syscalls(2))和<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据此进行编码。


(顺便说一句,每个使用的代码malloc都应该测试其失败,但是某些错误地测试错误;malloc可以返回NULL失败,人们应该针对这种情况进行测试)


GNU libc为您提供了自己的函数的钩子malloc(您甚至可以透明地通过它们使用Boehm的垃圾收集器)。这些挂钩可能会被弃用并且是非标准的。


如果使用GNU libc,则还要查看mallinfo(3)和malloc_stat(3)以及相关功能。


查看完整回答
反对 回复 2019-12-05
?
繁星coding

您也可以使用备用实施malloc和free如果您使用的是不同的内存分配器。例如,the 积内存分配器有时用于提高多线程应用程序的性能。


查看完整回答
反对 回复 2019-12-05

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信