如何根据以前的行为预测系统的行为

时间:2009-09-20 08:37:10

标签: c++ algorithm optimization memory parallel-processing

我正在寻找一种算法,该算法基于系统的先前行为,预测未来的行为。

我正在构建一个具有空块公共列表的并行内存分配器。每个线程在需要时都可以从该列表中获取块并从中进行分配。这些块按箱分组,具体取决于分配大小(8,12,16字节......到大约4 KB)。当块变空时,它将返回到全局列表(当然,同步开销)。如果bin中没有块为空,它会尝试从其他箱中的块“窃取”位置,然后再获取新的空箱。

现在有两种情况与我有关:

  1. 线程可能会分配,比如占用5个块的内存。过了一会儿,它会释放所有这些内存(并且这些块会转到全局列表)。紧接着,它再次分配5个块,解除分配,依此类推。在这种情况下,最好始终保留这5个块并且不将它们返回到全局列表,因为它避免了同步开销。
  2. 如果分配器“窃取”某个位置,它会使用原本会被浪费的内存。但是有些情况下会增加内存使用量。
  3. 我想建立一个可以观察这种模式的系统,并将结果保存到某个地方,以便下次,分配器知道什么是明智的做什么和不做什么(在bin X中保留至少N个块,不要“从垃圾箱里偷”。

    遗传算法有用吗?我对他们一无所知,但我听说他们擅长机器学习,或类似的东西。

    提前致谢!

4 个答案:

答案 0 :(得分:2)

有很多关于正确实现内存管理器的文章。这些文章中的大多数都提供了花费时间和原因的时间测量。所以我建议你看一下这个领域已经做过的事情。有很多有趣的想法,其中很多都运作良好,并且有明智和有趣的概念。

虽然机器学习技巧对学习和了解很有意思,但我怀疑它们在现实生活中不会给出好的结果。原因是他们需要很大的开销才能工作。 我相信更接近现代缓存工作方式的方法 - 最近最少使用的方法的不同变化。

所以在你的例子中,我会做以下事情:

  • 使用由不同尺寸制成的“缓存”并使用它。这意味着保存未返回给系统的最小大小,并用于“重用”。
  • 可以动态确定缓存大小:检查为此线程分配和取消分配新内存的频率。如果脱粒过于频繁(通常可能是时间参数),则缓存大小会增加。
  • 关于窃取:缓存大小可能是不可窃取的,解决了缓存和脱粒的问题。

此方法的主要缺点是内存开销。如果缓存大小减少,也可以减少它(因为在你的情况下这是一种权衡)。

答案 1 :(得分:1)

答案 2 :(得分:0)

也许你应该尝试计算特定线程的特定大小的块的分配和解除分配的数量,比如每秒。如果计数器很高并且分配数量与解除分配数量大致相同,那么您可能会尝试在下一秒内忽略释放量。

答案 3 :(得分:0)

如果您要使用大小为2,4,8,16等的空闲块,那么您的线程也应该请求大小为2,4,8,16等的内存。请求任何您需要的内容舍入到最接近的两个力量。