我在大学学习操作系统,我的任务之一是找到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()
论点。
所以,我在这里看到的只是你的基准不知何故对你不利:)