Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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 为什么代码一直在调用mmap和munmap?_C_Optimization - Fatal编程技术网

C 为什么代码一直在调用mmap和munmap?

C 为什么代码一直在调用mmap和munmap?,c,optimization,C,Optimization,我试图优化一个C代码。当我使用strace跟踪程序时,我发现它一直在调用mmap和munmap。但这段代码只是对使用malloc()分配的内存元素执行操作。有人能解释一下原因吗 malloc()不是系统调用,它只是一个库函数。根据您的平台和C库实现,您将看到一些用于实际获取内存的系统调用。从POSIX系统上的操作系统请求内存块的一种方法是调用mmap()。然后,库函数可以随心所欲地使用内存,根据需要分配内存,如果不再需要,可以稍后使用munmap()释放内存。malloc()的实现可能使用/de

我试图优化一个C代码。当我使用
strace
跟踪程序时,我发现它一直在调用
mmap
munmap
。但这段代码只是对使用
malloc()
分配的内存元素执行操作。有人能解释一下原因吗

malloc()
不是系统调用,它只是一个库函数。根据您的平台和C库实现,您将看到一些用于实际获取内存的系统调用。从POSIX系统上的操作系统请求内存块的一种方法是调用
mmap()
。然后,库函数可以随心所欲地使用内存,根据需要分配内存,如果不再需要,可以稍后使用
munmap()
释放内存。

malloc()的实现可能使用
/dev/zero
上的
mmap()
为堆分配内存

虽然
mmap()
通常用于像访问内存块一样访问普通文件,但它也可以与
/dev/zero
一起使用。每次映射此文件时,都会得到一个初始化为零的内存块,因此向进程添加内存块是一种有用的方法

传统上,这是使用
sbrk()
系统调用完成的。但这种操作相当有限:它只能扩展或缩小一端的数据段。如果您在堆中间释放大量内存,则不能将内存返回到系统,因为端部的对象仍在使用。
通过将
mmap
/dev/zero
一起使用,内存分配器可以为堆使用多个独立的内存块。如果释放其中一个块中的所有对象,则可以使用
munmap
将整个块返回系统。这就是为什么经常调用这两个函数的原因。

以前,您会看到大量的
sbrk
调用,但显然
mmap
在现代系统上更好-可能是因为它实际上更容易释放内存。非常感谢!我没有很清楚地表达我的问题。它在调用malloc时不执行mmap。但是在我之前分配的空间上执行其他操作时执行mmap。例如,我分配了两个大数组来保存两个矩阵,当执行矩阵乘法时,程序将继续调用mmap和munmap,为什么会发生这种情况?为什么?我认为mmap用于将磁盘空间映射到内存空间。它如何用于malloc?我已经更新了答案,解释了它是如何工作的,并包括了动机。谢谢,但为什么它在访问malloc分配的内存时仍然调用mmap和munmap?它不应该仅仅通过访问内存来实现这一点。只有在调用
malloc()
free()
时,它才应该这样做。您可以使用调试器查看发生这种情况时程序正在执行的操作。它们可以从库函数调用,比如stdio。