数组内存管理
Posted
技术标签:
【中文标题】数组内存管理【英文标题】:Array memory management 【发布时间】:2012-02-24 23:14:46 【问题描述】:我正在做我的计算机科学项目。我正在使用 C 进行多处理器编程。对我们的一个要求是,我们不能一直分配小块内存。需要时可以大块分配内存。
假设我在我的程序中使用结构。而且我的程序的工作方式需要动态内存分配。但它在我们使用的硬件中非常昂贵。所以最好的解决方案是在开始时分配一个大的内存池,并在需要时从这个池中分配内存。
我设想它的工作方式是,我将分配这些结构的位数组并编写我自己的内存管理模块,该模块从该池中分配和释放内存。但我想知道编写这些模块的最理想方式。是否有任何库可以帮助我管理内存,或者有什么方法可以编写这些库?
编辑:这是我使用的平台:运行 Ubuntu 的 AMD opteron 系统。 opterons 具有 NUMA 架构,我想在分配内存时利用它。因此,我没有使用 malloc,而是使用 numa_alloc_onnode 在一个特定节点上分配内存。我想使用它分配一大块内存,然后使用内存管理器来管理这块内存。
【问题讨论】:
我确信有一些库会有所帮助,但如果不了解平台和操作系统,任何人都很难推荐一个。 @Carey:我使用过的大多数内存管理系统都与平台无关(在 C 可用的地方运行),尽管知道特定的系统约束,例如嵌入式系统当然很重要。 @Eric:嵌入式系统是我提到它的原因。 OP 似乎暗示他正在使用一个不寻常的平台,这可能意味着一个不寻常的操作系统,或者根本没有操作系统。 查看空闲列表的工作原理。有一些方法可以在存储本身内部实现它们,没有空间开销(尽管有一些分配的搜索开销)。 【参考方案1】:那里有大量的内存池管理器,一些是商业的,一些是开源的。看看它们,并在您了解概况后随时在此处提出更具体的问题。
一些google结果(c内存池管理器开源):
http://256stuff.com/sources/mpool/
http://www.raven***.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
【讨论】:
嗨 Eric,我查看了这些链接。如果我理解正确,他们使用自己的内存分配器并从操作系统获取内存。但就我而言,我需要使用特定于此架构的特定调用来获取内存块。那么内存管理器就得使用这块内存并对其进行管理。有没有内存管理器可以满足这一点? 开始写长评论,然后决定更新我的答案。 根据您在 NUMA 平台上的事实更新了我的答案。以上是关于数组内存管理的主要内容,如果未能解决你的问题,请参考以下文章
C语言之动态内存管理(动态内存分配+经典笔试题+柔性数组)[建议收藏]