5

我目前正在调查在Windows下的malloc()实现。但在我的研究中,我偶然发现了让我感到困惑的事情:Windows内存分配问题

首先,我知道在API级别,windows主要使用调用HeapAlloc()VirtualAlloc()来分配内存。我从here收集微软实施malloc()(包括在CRT - C运行时)基本上呼吁HeapAlloc()> 480字节的块,否则管理一个特殊的区域分配VirtualAlloc()小分配,以防止碎片。

那么这一切都很好。但是接下来还有malloc()的其他实现,例如nedmalloc,声称比微软的malloc快125%。

这一切都让我不知道的几件事情:

  1. 为什么我们不能只调用HeapAlloc()为小块?在分散性方面表现不佳(例如,通过“先做”而不是“最适合”)?

    • 其实,有没有什么办法可以知道各种API分配调用的内幕?这会很有帮助。
  2. 是什么让比微软的malloc更快nedmalloc这么多?

  3. 从上面的,我得到的印象是HeapAlloc()/VirtualAlloc()是如此缓慢,它是malloc()快得多在一段时间只有一次打电话给他们,然后来管理分配的内存本身。这个假设是真的吗?或者是malloc()“包装”只是因为碎片需要? 有人会认为这样的系统调用会很快 - 或者至少有一些想法会被加入到它们中,以提高效率。

    • 如果这是真的,为什么这样呢?
  4. 平均来说,有多少内存(一个数量级)读/写是由一个典型的malloc调用(可能已经分配的段数的函数)来执行?我会直觉地说,这是一个普通节目的十几岁,对吗?

+0

另外,阅读关于“dlmalloc”的内容对于malloc策略来说是非常丰富的。 – Will 2010-07-07 22:53:35

回答

5
  1. 调用HeapAlloc不健全跨平台的。当他们希望时,MS可以自由地改变他们的实施;建议远离。 :)
  2. 它可能更有效地使用内存池,很像Loki库对其“小对象分配器”所做的操作。
  3. 通过任何实现总是很慢的堆分配通常很慢。分配器越“专业化”,速度越快。这使我们回到了第2点,它处理内存池(以及使用的特定于您的应用程序的分配大小)。
  4. 不知道。
+0

微软也可以自由地改变事物,使一切都变得更好。请参阅转换到低碎片堆。 – MSN 2010-07-07 22:52:28

+0

1.我也没有期待它,因为我在Windows上尝试malloc实现目标。但问题依然存在:它是无效的,是分裂的吗? 2.这意味着它可以更有效地管理指向空闲空间的指针,以便在内存中分配相应的块更快?你知道我在哪里可以读到关于内存池的内容吗? 正如用户在上面提示的那样,我开始使用dlmalloc(之前我已经详细介绍了它,但它确实听起来以unix为导向,将它描述为模仿unix调用的windows功能)。 – Norswap 2010-07-08 10:04:13

1

从上面的,我得到的印象是HeapAlloc()/的VirtualAlloc()是如此之慢,这是快得多的malloc(),以在一段时间打电话给他们只有一次,然后来管理分配记忆本身。这个假设是真的吗?

OS级别的系统调用是为管理整个进程内存空间而设计和优化的。使用它们为整数分配4个字节实际上是不理想的 - 通过管理库代码中的微小分配,让操作系统针对更大的分配进行优化,从而获得总体上更好的性能和内存使用率。至少据我了解它。