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