【问题标题】:Test for memory fragmentation测试内存碎片
【发布时间】:2012-12-11 10:44:26
【问题描述】:

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

接下来我的问题是:我将如何测试各种分配策略(例如,最适合、最适合和最差适合)。现在我只是迭代预定义的次数,每次分配一个大小为 1-N 字节的块,其中 N 类似于 20000。基本上我分配一些迭代然后我通过释放一些分配的块。在退出之前,我检查了 freelist 并计算了外部碎片。我不确定这是否是要走的路,还是有更好的方法来做到这一点?

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

希望这不会让人困惑:)

【问题讨论】:

  • 如果你的分配器的 free() 合并相邻的块,碎片的数量将等于 freelist 上的项目数(加或减一)
  • @wildplasser。感谢您的回复:) 我知道这一点:) 实际上我已经有一个计算外部碎片的工作实现。我更想知道我用于测试不同策略的方法是否足够……或者有更好的方法吗?
  • 也许最有用的衡量标准是计算正在使用的实际页面数、有效页面数以及它们的比率。另一个衡量标准可能是虚拟地址的有效与实际跨度(最大(地址)-最小(地址)),地址空间也是一种宝贵的资源。
  • @wildplasser。确实不错的提示:)

标签: c memory-management fragmentation


【解决方案1】:

这里只是一个想法:您可以从实际运行的系统中采样数据,然后将其用作您的测试数据。然后,您的测试人员只需要读取记录数据的日志文件并重播相同的 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 重建软件包,一个很好的资源是 Linux from Scratch 项目,http://www.linuxfromscratch.org/

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 2013-08-14
    • 2010-10-26
    • 2018-09-25
    • 2011-01-17
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多