c - 应用什么算法来连续重新分配小内存块?

标签 c memory memory-management dynamic-memory-allocation memory-fragmentation

在C程序中,我面临需要大量内存块的事务,我需要知道是否有算法或最佳实践技术用于处理所有这些malloc/free,我使用数组来存储这些内存块但在某些时候数组本身已满,重新分配数组只会更加浪费,处理这个问题的优雅方法是什么?

最佳答案

这种情况下最好的算法是 free list分配器+二叉搜索树。

您向系统请求一大块内存,然后从该 block 中分配固定大小的内存块。当 block 已满时,您将分配另一个 block ,并将它们链接到红黑或 AVL 二叉搜索区间树(否则在 free 期间通过迭代 block 列表来搜索 block 将成为瓶颈)

同时,多线程和线程同步变得很重要。如果您只使用互斥锁或简单的自旋锁,您会发现 libc malloc 的工作速度比自定义内存分配器快得多。解决办法见Hazard pointer ,即每个线程都有自己的内存分配器(或每个 CPU 核心一个分配器)。这会增加另一个问题 - 当一个线程分配内存而另一个线程释放它时,这将需要在 free 函数期间搜索确切的分配器,并严格锁定或无锁数据结构。

最好的选择 - 您可以使用 jemalloc , tcmalloc或任何其他通用建议的快速内存分配器来完全或部分替换您的 libc(即 pdmalloc)默认分配器。

关于c - 应用什么算法来连续重新分配小内存块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50722561/

相关文章:

c - 为什么 64 位 Ubuntu 中的 8 字节数组 (C) 占用 16 字节?

C:对 'clock()' 的 undefined reference

c - msync的 'length`参数不起作用

c++ - 以下数组从哪里获取内存?

c# - 将字符串属性作为键添加到字典中会克隆字符串吗?有适当的解决方法吗?

c - C 中的 Arraylist 不工作

C++:作为指针的全局变量

python - 为什么 Python `Memory Error` 列表 `append()` 剩余大量 RAM

java - 查找分配给进程的虚拟内存量

c++ - new 分配的 free() 内存安全吗?