1

我正在做我的计算科学项目。我正在使用 C 进行多处理器编程。对我们的一个要求是,我们不能一直分配小块内存。需要时可以大块分配内存。

所以想象一下我在我的程序中使用结构。而且我的程序的工作方式需要动态内存分配。但它在我们使用的硬件中非常昂贵。所以最好的解决方案是在开始时分配一个大的内存池,并在需要时从这个池中分配内存。

我设想它的工作方式是,我将分配这些结构的位数组并编写我自己的内存管理模块,该模块从这个池中分配和释放内存。但我想知道编写这些模块的最理想方式。是否有任何库可以帮助我管理内存,或者有什么方法可以编写这些库?

编辑:这是我使用的平台:运行 Ubuntu 的 AMD opteron 系统。opterons 具有 NUMA 架构,我想在分配内存时利用它。因此,我没有使用 malloc,而是使用numa_alloc_onnode 在一个特定节点上分配内存。我想使用它分配一大块内存,然后使用内存管理器来管理这个内存。

4

1 回答 1

4

那里有大量的内存池管理器,一些是商业的,一些是开源的。看看他们,并在你有一个概述后随时在这里提出更具体的问题。

一些google结果(c内存池管理器开源):

http://256stuff.com/sources/mpool/

http://www.ravenbrook.com/project/mps/

这是 IBM 关于这个主题的一篇好文章:

http://www.ibm.com/developerworks/linux/library/l-memory/

而且由于您提到了多处理器环境(尽管与内存管理没有直接关系),因此这也是值得一读的:

http://drdobbs.com/go-parallel/article/showArticle.jhtml?articleID=217500206

更新

根据所需的库的可移植性,有不同的方法。如果可移植性很重要,该库会在 malloc(或 calloc)周围提供一个包装器来获取内存块,然后应用更有效的实现(根据库想要实现的特定目标来衡量)。针对特定操作系统的库通常会使用本机操作系统调用,以牺牲可移植性为代价获得一些性能和利用该操作系统细节的能力。

内存管理库所追求的具体目标各不相同。以下是我多年来看到的一些目标:

  • 大对象和小对象的单独管理策略
  • 将长期存在的事物与将快速删除的事物分开的管理策略
  • 调试内存管理问题(例如,将特定模式写入分配的内存并在最后分配一些额外的填充,以便调试函数可以查看填充是否被越界指针访问覆盖)
  • 给定特定平台的限制,更快的内存访问(例如,一些分配可能很昂贵,而另一些则相对便宜)。
  • 支持内存碎片整理(例如,通过真正将指针分配给指针,具有访问内存的特殊语义)。

更新 2

根据您的更新...我的第四个要点适用。这是为 NUMA 架构创建堆管理器的好读物(源代码在文章末尾):

http://ebookbrowse.com/numa-aware-heap-memory-manager-article-final-pdf-d12526838

于 2012-02-24T23:17:59.917 回答