如何最小化固定分配方案所需的内存量?

时间:2013-06-21 10:15:01

标签: algorithm memory-management

下图显示了16种不同尺寸的存储块所需的寿命:

enter image description here

我基本上寻找的是一些 N 大小的块 size i 和生命周期 [begin i ,end i ,返回最小尺寸的总内存在我们的总时间间隔内需要包含它们的块和 N 偏移, 偏移 i ,进入输入块的总内存块。

一个简单的非最优算法如下:

int offsets[N];
offsets[0] = 0;
int total_size = size[0];
for (int i = 1; i < N; ++i)
{
    offsets[i] = offsets[i - 1] + size[i - 1];
    total_size += size[i];
}

我们当前的算法是按大小对块进行排序,然后从最大到最小处理它们,找到块不与已经“分配”的块重叠的第一个偏移量。这本质上是一个贪婪的算法,所以我觉得有可能做得更好。

算法只需要在应用程序启动时运行一次,因此它不必是超高速的。分配数量大约为10-50,对于我们的目的,时间可以离散化为大约50个固定大小的单位。

1 个答案:

答案 0 :(得分:0)

开始 结束 时间间隔列表中查找最短开始时间和最长结束时间。这是您感兴趣的时间的总间隔(t_min,t_max)。接下来,将时间间隔划分为一些离散且均匀的间隔。让这个区间的长度为 u 。这基本上是内存管理的最大分辨率(您可以释放和/或声明一块内存的频率)。

对于每个时间单位,确定哪些分配ID需要内存以及当时需要的内容大小,称之为 s(t,id)。所有分配ID上 s(t,id)的总和是在任何给定时间所需总内存量的下限。你不能做比这个函数的最大值更好的事情,它没有考虑到在同一个区域分配事物而不在每个时间步移动它们的愿望。

要为每个项目找到最佳位置,您可以使用启发式搜索。基本上,搜索每个内存块的所有可能起始地址的状态空间,以获得占用最小内存总量的解决方案,您可以通过模拟从t_min到t_max的时间进度来找到它。

可能值得尝试的启发式方法是优先选择大块占用先前由其他大块占用的空间的分配,并且将小块放置在对策略的最大内存使用量贡献很小的位置。您还可以修剪任何比目前为止看到的最差的策略,因为该策略声称的最大内存随时间变化是单调的。

启发式搜索方法可能很慢,但听起来你更关心最佳内存使用情况而不是分配算法的运行时。