2012-12-25 79 views
3

因此,作为操作系统课程的一部分,我实现了一个内存分配器(就像C中的malloc一样)。可用空间存储在链接列表中。内存碎片测试

我在接下来的问题:我将如何去测试各种分配策略(例如,首次拟合,最佳拟合和最差拟合)。现在我只是迭代预定义的次数,每次分配一个大小为1-N字节的块,其中N大约是20000.基本上,我分配了一些迭代,然后通过释放一些分配来切换它块。在退出之前,我检查freelist并计算外部碎片。我不确定这是否是要走的路,或者是否有更好的应对措施?

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

希望这不是混乱的:)

+0

如果您的分配器的空闲()合并相邻的块,则碎片的数量将等于freelist(加号或减号) – wildplasser

+0

@wildplasser上的项目数。感谢您的回复:)我知道这:)实际上我已经有一个计算外部碎片的工作实现。我更感兴趣的是知道用于测试不同策略的应用是否足够,或者有更好的方法来做到这一点? –

+0

也许最有用的测量方法是计算正在使用的实际页面的数量,以及有效页面的数量,以及它们的比例。另一种措施可能是虚拟地址的有效与实际范围(最大(地址) - 最小(地址)),地址空间也是一种有价值的资源。 – wildplasser

回答

0

这里只是一个想法:你可以从实际运行的系统中进行数据采样,然后使用它作为您的测试数据。然后您的测试人员只需要读取记录数据的日志文件,然后向分配器重放相同的alloc(),free()调用。要在实践中实现,这可能会非常棘手,但在Linux上用glibc,他们有一个正式的方式来定制挂钩增加的malloc,realloc的和自由:

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/