马洛克什么时候不叫mmap?



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

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

malloc()总是叫mmap()吗?

谢谢

这既不是由C,C++也不是POSIX标准定义的。

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

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

如果使用 glibc:

可调谐:glibc.malloc.mmap_threshold

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

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

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

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

每次

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

这句话在精神上类似于说"今天没有办法开始工作"——只有在知道很多背景的情况下才有意义。您必须披露您使用的确切基准测试,glibc版本,发行版等。我很确定,如果您分配大量小对象(例如 16-32 字节),您将不会在每次调用中看到mmap()

与数据结构上的"有限"操作相比,系统调用是性能消耗者,因此malloc()如果它真的总是调用mmap(),无论情况如何,它的性能都会非常差。当然,如果你总是像malloc(1024)一样称呼它,那么是的,它最终可能会经常mmap()

你还想看看通过了什么样的mmap()论点。

所以,我在这里看到的只是你的基准不知何故对你不利:)

最新更新