gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:24:19 27 4
gpt4 key购买 nike

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

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

最佳答案

经常,mallocfree使用较低级别的虚拟内存分配服务并一次分配多个页面(甚至兆字节),使用 system calls喜欢mmapmunmap (也许还有 sbrk )。经常malloc更喜欢重用以前 free d 相关的内存空间。大多数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 , 选择一些 other ones或实现您自己的,或使用 strace通过实验找出答案。

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


非常快malloc

(我相信这可能是 malloc 的最快实现;但是它不是很有用;它符合标准,例如 n1570 或更好)

我坚信 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) { }

当然你会编码callocrealloc相应地。

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


GNU libc 给你 hooks为你自己malloc函数(你甚至可以通过它们透明地使用 Boehm's Garbage Collector)。这些 Hook 可能会被弃用并且是非标准的。

如果使用 GNU libc,另请查看 mallinfo(3)malloc_stat(3)及相关功能。

关于c - malloc/free 是 libc 提供的系统调用还是库例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8457278/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com