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 | 内存管理流程 )