我正在使用C中固定大小的数组进行动态内存分配模拟(malloc()和free()),我想知道哪些会产生最少的碎片(内部和外部)?我不关心速度,能够减少碎片是我想要解决的问题。
对于好友系统,我读过它内部碎片很多,因为大多数请求的大小都不是2的幂。
为了最合适,我听到的唯一消极是它是连续的,所以搜索需要很长时间(在我的情况下不是问题)。在任何情况下,我都可以使用我理解的二叉树来搜索。我还可以将固定大小的数组拆分为两个,其中左侧大小用于较小的块,正确的大小用于较大的块。我不知道其他任何负面因素。
对于隔离拟合,它类似于伙伴系统,但我不确定它是否具有相同的碎片问题,因为它不会被2的幂分割。
有没有人有过一些统计数据或知道我之前使用过这些问题的答案?
答案 0 :(得分:2)
控制碎片是依赖于用例的。永远不会发生碎片的唯一情况是,当您调用malloc()函数时,malloc()函数会返回固定大小的内存块。这更多地涉及内存池。一些高端服务器经常这样做是为了在他们知道要分配什么以及他们将保留这些分配的时间时提高性能。
当您开始考虑减少通用内存管理器中的碎片时,您提到的这些简单算法将无济于事。有一些复杂的内存管理算法,如jemalloc,tcmalloc和Poul-Henning Kamp malloc,可以解决这类问题。围绕此发布了许多白皮书。 ACM和IEEE有很多关于此的文献。