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

时间:2014-10-03 01:24:34

标签: c optimization

我正在尝试优化C代码。当我使用strace跟踪该计划时,我发现它一直在调用mmapmunmap。但是这段代码只是对使用malloc()分配的内存元素进行操作。有人可以解释一下原因吗?

2 个答案:

答案 0 :(得分:2)

malloc()不是系统调用,它只是一个库函数。根据您的平台和C库实现,您将看到一些用于实际获取内存的系统调用。在POSIX系统上从操作系统请求内存块的一种方法是调用mmap()。然后,库函数可以根据需要对内存执行操作,并在其认为合适时将其删除,如果不再需要,可以稍后使用munmap()释放它。

答案 1 :(得分:1)

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

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

传统上,这是使用sbrk()系统调用完成的。但是这个操作相当有限:它只能在一端扩展或缩小数据段。如果在堆中间释放大量内存,则无法将内存返回系统,因为最后的对象仍在使用中。

通过将mmap/dev/zero一起使用,内存分配器可以为堆使用多个独立的内存块。如果释放其中一个块中的所有对象,则可以使用munmap将整个块返回给系统。这就是为什么你会看到这两个被频繁调用的原因。