测试内存碎片

时间:2012-12-25 13:25:44

标签: c memory-management fragmentation

因此,作为我正在考虑的OS课程的一部分,我实现了一个内存分配器(就像C中的malloc一样)。可用空间存储在链表中。

我的问题如下:我将如何测试各种分配策略(例如,先适合,最适合和最差适合)。现在我只是迭代预定次数,每次分配一个大小为1-N字节的块,其中N类似于20000.基本上我分配了一些迭代然后我通过释放一些分配来切换它块。在退出之前,我检查空闲列表并计算外部碎片。我不确定这是否可行,或者是否有更好的方法来做这件事?

为每个策略选择随机块大小的一个问题是,如果分配的块大小不同,则无法真正比​​较它们,对吧?所以替代方案是执行相同的测试,现在我只使用相同的alloc大小并在测试每个策略时释放相同的块。

希望这不要混淆:)

1 个答案:

答案 0 :(得分:0)

这只是一个想法:您可以从实际运行的系统中采样数据,然后将其用作测试数据。然后,您的测试人员只需要读取记录数据的日志文件,并重放与分配器相同的alloc(),free()调用。在实践中实现这一点可能很棘手,但在使用Glibc的Linux上,他们有一种官方的方法可以向malloc,realloc和free添加自定义钩子:

http://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html

所以基本上我想你可以用钩子构建一个修改过的glibc,它通过malloc(),realloc()和free()调用记录每个分配请求。使用启用日志的glibc运行一些典型的程序,并使用这些程序执行一些典型的操作。尝试以某种方式使其具有代表性 - 比如运行Apache,如果您专门用于测试Web服务器的使用情况等等。生成的日志应该是对系统“真实”分配行为的合理模拟。为了使测试更准确,您应该重复使用其他系统或其他方案等的日志记录过程...以使您的采样更具代表性,并且不易受“吸虫”影响。一个好的分配器应该在尽可能多的真实实时测试中最大化性能,而不是有时候工作得非常好并且在其他时间表现不佳。

对于像Glibc这样的Linux重建软件包,一个很好的资源是来自Scratch项目的Linux,http://www.linuxfromscratch.org/