malloc 什么时候不调用 mmap?

3

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

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

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

谢谢


2
请注意,您可以简单地获取并阅读系统使用的任何内存分配器(或类似jemalloc或tcmalloc的自定义分配器)的源代码。这非常有教育意义。或者您可以查看非正式文档 - Botje
malloc()通常为了提高性能而调用用户空间子分配器。如果子分配器用尽,则可以进行更多空间的系统调用。 - Martin James
2
我敢打赌 $0.02,微软编译器附带的 malloc() 根本不会调用 mmap() :-) - Peter
...或 virtualAlloc(),或类似的 API :) - Martin James
2个回答

9

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

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

不一定。这取决于malloc实现、配置和分配的大小,可能还有其他因素。

如果使用glibc:

可调整的:glibc.malloc.mmap_threshold

此可调整项取代MALLOC_MMAP_THRESHOLD_环境变量,并具有相同的功能。

当设置此可调整项时,所有大小大于此值(以字节为单位)的块都将在常规堆之外使用mmap系统调用进行分配。这样可以保证这些块的内存在释放时能够返回给系统。请注意,仍然可能会通过mmap分配小于此阈值的请求。

如果未设置此可调整项,则默认值设置为“131072”字节,并且阈值会根据程序的分配模式动态调整。如果设置了可调整项,则禁用动态调整,并将其值设置为静态值。

如果不使用glibc,则请查看所使用实现的文档或源代码。


0
每次使用malloc()时,我都看到mmap()系统调用。这种说法类似于说“今天没有办法去上班”——只有在了解大量上下文的情况下才有意义。您必须披露您正在使用的确切基准测试、glibc版本、发行版等。我非常确定,如果您正在分配大量小对象(例如16-32字节),则不会在每个调用上看到mmap()。
与对数据结构的“有限”操作相比,系统调用是性能障碍,因此,如果malloc()真的总是调用mmap(),无论情况如何,它的性能将非常差。当然,如果您总是像malloc(1024)这样调用它,那么它可能经常进行mmap()。
您还需要查看传递的mmap()参数类型。所以,我在这里看到的只是您的基准测试在某种程度上对您不利 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接