如果我使用mmap而不是malloc分配内存怎么办?

时间:2012-01-15 13:32:10

标签: c linux memory-management malloc mmap

使用mmap(使用MAP_PRIVATE和MAP_ANONYMOUS)分配内存比使用malloc有什么缺点?对于函数范围内的数据,无论如何我都会使用堆栈内存,因此不是malloc.

我们想到的一个缺点是动态数据结构,例如树和链表,您经常需要分配和释放小块数据。使用mmap会有两个原因造成的代价很高,一个用于分配4096字节的粒度,另一个用于要求进行系统调用。

但在其他情况下,您认为malloc是否优于mmap?其次,我是否过高估计动态数据结构的mmap的劣势?

mmap超过malloc的一个优势我可以想到,当你执行munmap时,内存会立即返回到操作系统,而对于malloc/free,我猜内存uptil数据段断点永远不会返回,但保留重用。

3 个答案:

答案 0 :(得分:27)

是的,malloc优于mmap。它更容易使用,更细粒度和更便携。最后,无论如何都会调用mmap

如果您开始使用mmap进行日常内存管理,那么您需要实现某种方式,以较小的块而不是页面来分配它,并最终重新实现malloc - 在次优内方式,可能。

答案 1 :(得分:19)

首先,mmap()是一个特定于平台的构造,所以如果你计划编写可移植的C,它已经出来了。

其次,malloc()基本上是根据mmap()实现的,但它是一种围绕系统调用的智能库包装器:它将在需要时从系统请求新内存,但在此之前它将在已经致力于该过程的区域中选择一块内存。

因此,如果您想进行普通的动态内存分配,请使用malloc(),故事结束。使用mmap()进行内存分配应该保留用于特殊情况(例如,如果你真的想要自己整页,在页面边界对齐),并且总是抽象成一段库代码,以便其他人可以轻松了解你在做什么。

答案 2 :(得分:3)

mmap具有malloc不具有的一个功能mmap允许您使用巨大页面进行分配(标志参数设置为MAP_HUGETLB),而malloc 1}}没有那个选项。