Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ malloc什么时候不调用mmap?_C++_C_Linux_Systems Programming - Fatal编程技术网

C++ malloc什么时候不调用mmap?

C++ malloc什么时候不调用mmap?,c++,c,linux,systems-programming,C++,C,Linux,Systems Programming,我在大学学习操作系统,我的任务之一是找出malloc()不会导致mmap()系统调用的情况 我使用stracelinux实用程序跟踪系统调用,但在我的情况下,每次使用malloc()时,我都会看到mmap()syscalls malloc()是否总是调用mmap() 谢谢< P>这既不是由C、C++也不是POSIX标准定义的。< /P> malloc()是否总是调用mmap() 没必要。这取决于malloc实现、配置和分配的大小以及可能的其他因素 如果使用glibc: 可调:glibc.mall

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

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

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


谢谢

< P>这既不是由C、C++也不是POSIX标准定义的。< /P> malloc()是否总是调用mmap()

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

如果使用glibc:

可调:glibc.malloc.mmap_阈值

此可调变量取代MALLOC_MMAP_THRESHOLD_uu环境变量,并且在功能上相同

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

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

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

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

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

与数据结构上的“有限”操作相比,系统调用是性能消耗,因此无论在何种情况下,如果总是调用
mmap()
,那么
malloc()
的性能都会非常差。当然,如果您总是像
malloc(1024)
那样调用它,那么是的,它可能会经常调用
mmap()

您还需要查看传递了哪种类型的
mmap()
参数


因此,我在这里看到的是,您的基准测试在某种程度上与您相反:)

请注意,您可以简单地获取并读取系统使用的任何内存分配器(或像jemalloc或tcmalloc这样的自定义内存分配器)的源代码。这很有教育意义。或者,您可以查看malloc()出于性能原因通常调用用户空间子分配器。如果子分配器用完,可以进行系统调用以获得更多空间。我打赌0.02美元,Microsoft编译器附带的
malloc()
根本不调用
mmap()
:-)…或virtualAlloc(),或类似的API:)