malloc啥时候不调用mmap?

Posted

技术标签:

【中文标题】malloc啥时候不调用mmap?【英文标题】:When does malloc not call mmap?malloc什么时候不调用mmap? 【发布时间】:2020-11-20 08:47:45 【问题描述】:

我正在大学学习操作系统,我的任务之一是找到malloc() 不会引起mmap() 系统调用的情况。

我使用strace linux 实用程序来跟踪系统调用,但在我的情况下,每次使用malloc() 时我都会看到mmap() 系统调用。

malloc() 是否总是调用mmap()

谢谢

【问题讨论】:

请注意,您可以简单地获取和读取系统使用的任何内存分配器的源代码(或自定义的,如 jemalloc 或 tcmalloc)。这是很有启发性的。或者你可以看看informal documentation malloc() 通常出于性能原因调用用户空间子分配器。如果子分配器用完,可以进行系统调用以获取更多空间。 我打赌 0.02 美元,微软编译器附带的 malloc() 根本不会调用 mmap() :-) ...或 virtualAlloc(),或类似的 API :) 【参考方案1】:

这既不是由 C、C++ 或 POSIX 标准定义的。

malloc() 是否总是调用 mmap()?

没有必要。这取决于malloc 的实现、配置和分配的大小以及可能的其他因素。

如果使用 glibc:

可调参数:glibc.malloc.mmap_threshold

此可调参数取代了 MALLOC_MMAP_THRESHOLD_ 环境变量,并且功能相同。

设置此可调参数后,所有大于此值(以字节为单位)的块都将分配到普通堆之外,使用 mmap 系统 称呼。这样可以保证这些块的内存可以 免费返回系统。请注意,请求小于 这个阈值可能仍然是通过 mmap 分配的。

如果未设置此可调参数,则默认值设置为“131072”字节,并动态调整阈值以适应分配 程序的模式。如果设置了可调参数,则动态调整 被禁用并且值设置为静态。

如果不使用 glibc,请查阅您使用的实现的文档或源代码。

【讨论】:

【参考方案2】:

每次使用 malloc() 时,我都会看到 mmap() 系统调用。

这句话在精神上类似于说“今天没办法上班”——只有在了解大量上下文时才有意义。您必须披露您使用的确切基准,glibc 版本、发行版等。我很确定如果您分配大量小对象(例如 16-32 字节),您将不会看到mmap() 每次通话。

与数据结构上的“有限”操作相比,系统调用会消耗性能,因此如果malloc()真的总是调用mmap(),无论在什么情况下,它的性能都会很差。当然,如果你总是把它称为malloc(1024),那么是的,它可能会经常以mmap()-ing 结束。

您还想查看传递了哪些mmap() 参数。

所以,我在这里看到的只是你的基准以某种方式不利于你:)

【讨论】:

以上是关于malloc啥时候不调用mmap?的主要内容,如果未能解决你的问题,请参考以下文章

在malloc,为什么要使用brk?为什么不直接使用mmap?

malloc实现机制缓冲机制文件操作mmap虚拟地址(day06)

Linux 内核 内存管理内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )

我啥时候应该在 C 中使用 malloc,啥时候不应该?

我啥时候应该在 C 中使用 malloc,啥时候不应该?

malloc是如何分配内存的