c - 数组内存管理

标签 c memory-management ubuntu numa

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

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

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

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

最佳答案

有大量的内存池管理器,有些是商业的,有些是开源的。看看它们,在了解概况后,随时可以在这里提出更具体的问题。

一些 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)的包装器来获取内存块,然后应用更有效的实现(根据库想要实现的特定目标进行衡量)。针对特定操作系统的库通常会使用 native 操作系统调用,以牺牲可移植性为代价获得一些性能和利用该操作系统细节的能力。

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

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

更新 2

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

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

关于c - 数组内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9439402/

相关文章:

javascript - 纬度经度格式错误 DDDMM.MMMM 2832.3396N

ios - 释放定时器 block 中使用的内存,但在停止定时器时从中分配

linux - 如何在 Ubuntu 上清除 RapidSVN 的设置?

c - 警告 : unused variable

c - 在不生成重复项的情况下查找字符串的所有唯一排列

linux - Linux 上的可清除内存区域

c - 动态地从文件或标准输入中读取一行

Oracle 10g express GUI客户端?

php - 从源代码编译 PHP 7

c - (C) 获取安全的 int 输入