【发布时间】:2013-05-20 14:38:20
【问题描述】:
我目前正在开发一个缓存服务器,它本身就使用了很多 RAM(我正在一个有很多 HTTP 流量的服务器上测试它,同时有一个 WordPress 和一个自定义网络应用程序使用它来缓存内存中的数据)。
服务器显然执行了很多昂贵的 malloc/realloc/free 操作,所以我想知道是否应该使用自定义内存分配器,也许是在开始时预分配一个大“内存池”然后使用它在执行 malloc/realloc 时提供所需大小的空闲“块”,并在调用 free 时将它们标记为已释放。
我是在走正确的道路还是我真的不需要这样的东西?有没有这样的分配器,还是我必须自己编写一个?
重要提示:
服务器是单线程(使用多路复用),所以我不 在多线程中需要具有高性能等级的分配器 应用程序(例如 jemalloc,据我了解是 与单线程应用程序中的普通 malloc 一样好...... 如果我错了,请纠正我)。
在您询问/建议之前,我已经使用 Valgrind 删除了每个 可能的内存泄漏。我只需要优化,而不是修复。
内存碎片是个问题,所以我也应该使用一种方法来优化它。
使用适当的配置指令,用户可以设置 来自服务器的最大可用内存,这就是预分配的原因 我想到了固定内存池。
我没有性能问题;我开发这个只是为了好玩和好奇。我喜欢学习和尝试新的编程技术。
是的,我使用过 callgrind,而 malloc 是最昂贵的操作之一。
【问题讨论】:
-
"我需要自定义内存分配器吗?"如果你不得不问,答案是“不”。
-
如果您没有性能问题,为什么要修复未损坏的部分?
-
因为我开发这个只是为了好玩和好奇,我喜欢学习和试验新的编程技术,所以......为什么不呢? :)
-
+1 凯文的评论。这个问题的答案基本上总是“不”。特别是对于单线程使用,所有现代分配器使用的基本 dlmalloc 算法是无与伦比的。
-
@R.. 这不是无与伦比的。它解决的问题肯定是一流的:实现
malloc和free,也就是所有人的一切。但是,如果您知道您的内存使用模式并且它足够统一,那么另一种更简单的分配器就足够了(例如:如果您只需要固定大小的块,则使用池;如果您只需要 FIFO 行为,则使用堆栈分配器)然后专门用于该用例很有可能击败*malloc,因为它可以做出*malloc无法做出的有用假设(并相应地进行优化)。
标签: c memory memory-management