【问题标题】:What if I allocate memory using mmap instead of malloc?如果我使用 mmap 而不是 malloc 分配内存怎么办?
【发布时间】:2012-01-15 13:32:10
【问题描述】:

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

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

但在其他情况下,你认为mallocmmap 更好吗?其次,我是否高估了mmap 对于动态数据结构的劣势?

mmap 相对于malloc 的一个优势我能想到的是,当您执行munmap 时,内存会立即返回给操作系统,而使用malloc/free,我猜内存直到数据段断点是从未返回,但保留以供重复使用。

【问题讨论】:

  • malloc 会为你调用 mmap,如果需要的话……只要坚持使用 malloc。
  • 另一个缺点是,如果你在调用mmap 时乱扔代码,它的可移植性就会降低。
  • 为什么要让生活变得过于复杂?
  • Malloc 更适合小分配和高比例的 malloc/free,而不是不那么大的大小。这是因为 malloc 可以向一个巨大的池请求小型请求并从中进行小型分配/解除分配,而无需任何 mmap/munmap。
  • 我认为这将是真正有用的唯一地方是实现内存池。使用 malloc,您会让自己对碎片持开放态度。使用 mmap,您可以将整个池返回给操作系统,而不会在地址空间的末尾留下一个很小的字符串片段(例如)。

标签: c linux memory-management malloc mmap


【解决方案1】:

是的,mallocmmap 好。它更易于使用、更细粒度且更便携。最后还是会调用mmap

如果您开始使用mmap 进行日常内存管理,您将希望实现某种方式将其分割成比页面更小的块,并且您最终将重新实现malloc——可能是以一种次优的方式。

【讨论】:

  • 很好的深入回答,因为它提到malloc 调用mmap
【解决方案2】:

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

其次,malloc() 本质上是根据mmap() 实现的,但它是一种围绕系统调用的智能库包装器:它会在需要时向系统请求新内存,但在那之前它会选择一块已提交给进程的区域中的内存。

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

【讨论】:

  • 即使你自己想要一个完整的页面,那么使用posix_memalign 可能会更好,它会更快地分配,更快地释放,并将内核从跟踪另一个的麻烦中解放出来虚拟机真正使用mmap 的唯一原因是,如果您想将文件描述符映射到内存(最常见的用途)或正在实现内存分配器(即使这样,也有充分的理由更喜欢sbrk)。
【解决方案3】:

mmap 具有 malloc 没有的一个功能是 mmap 允许您使用 Huge Pages 进行分配(标志参数已设置 MAP_HUGETLB),而 malloc 没有该选项。

【讨论】:

  • 它还允许您要求操作系统预先分配所有内存,以避免页面错误(用于低延迟编程)。
猜你喜欢
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2017-12-15
  • 2015-09-29
  • 2014-10-23
  • 2014-06-13
相关资源
最近更新 更多