繁体   English   中英

Windows内存分配问题

[英]Windows memory allocation questions

我目前正在研究Windows下的malloc()实现。 但是在研究中,我偶然发现了令我困惑的事情:

首先,我知道在API级别上,Windows主要使用HeapAlloc()VirtualAlloc()调用来分配内存。 我从这里收集到,Microsoft的malloc() (包含在CRT中-C运行时)基本上对大于480字节的块调用HeapAlloc() ,否则为小分配管理用VirtualAlloc()分配的特殊区域,为了防止碎片化。

好吧,这一切都很好。 但是然后还有malloc()其他实现,例如nedmalloc ,它声称比Microsoft的malloc快高达125%。

所有这些使我感到奇怪:

  1. 为什么我们不能只为小块调用HeapAlloc() 在碎片化方面是否表现不佳(例如,通过“第一适应”而不是“最佳适应”)?

    • 实际上,有什么方法可以知道各种API分配调用背后的情况吗? 那会很有帮助。
  2. 是什么使nedmalloc比Microsoft的malloc快得多?

  3. 从上面的内容,我得到的印象是HeapAlloc() / VirtualAlloc()是如此之慢,以至于malloc()偶尔仅调用一次然后管理分配的内存本身要快得多。 这个假设是真的吗? 还是由于碎片而仅需要malloc() “包装器”? 有人会认为像这样的系统调用会很快-或至少应该考虑其中的一些想法才能使它们高效。

    • 如果是真的,为什么会这样呢?
  4. 平均而言,一个典型的malloc调用执行了多少次(数量级)内存读/写(可能是已经分配的段数的函数)? 我可以凭直觉说一个普通程序的费用是几十美元,对吗?

  1. 调用HeapAlloc听起来并不跨平台。 MS可以根据需要自由更改其实现; 建议远离。 :)
  2. 它可能更有效地使用内存池,就像Loki库使用其“小对象分配器”一样
  3. 堆分配本质上是通用的,但通过任何实现总是很慢。 分配器越“专业化”,它将越快。 这使我们返回到第二点,该点处理内存池(以及针对您的应用程序使用的分配大小)。
  4. 不知道

从上面的内容,我得到的印象是HeapAlloc()/ VirtualAlloc()是如此之慢,以至于malloc()偶尔仅调用一次然后管理分配的内存本身要快得多。 这个假设是真的吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM