我正在尝试优化C代码。当我使用strace
跟踪该计划时,我发现它一直在调用mmap
和munmap
。但是这段代码只是对使用malloc()
分配的内存元素进行操作。有人可以解释一下原因吗?
答案 0 :(得分:2)
malloc()
不是系统调用,它只是一个库函数。根据您的平台和C库实现,您将看到一些用于实际获取内存的系统调用。在POSIX系统上从操作系统请求内存块的一种方法是调用mmap()
。然后,库函数可以根据需要对内存执行操作,并在其认为合适时将其删除,如果不再需要,可以稍后使用munmap()
释放它。
答案 1 :(得分:1)
malloc()
的实现可能使用mmap()
上的/dev/zero
来为堆分配内存。
虽然mmap()
通常用于访问普通文件,就好像它们是内存块一样,但它也可以与/dev/zero
一起使用。每次映射此文件时,都会得到一个用零初始化的内存块,因此它是向进程添加内存块的有用方法。
传统上,这是使用sbrk()
系统调用完成的。但是这个操作相当有限:它只能在一端扩展或缩小数据段。如果在堆中间释放大量内存,则无法将内存返回系统,因为最后的对象仍在使用中。
通过将mmap
与/dev/zero
一起使用,内存分配器可以为堆使用多个独立的内存块。如果释放其中一个块中的所有对象,则可以使用munmap
将整个块返回给系统。这就是为什么你会看到这两个被频繁调用的原因。