【问题标题】:How to calculate fragmentation?如何计算碎片化?
【发布时间】:2011-06-02 23:39:25
【问题描述】:

假设你有一些包含一堆字节的内存:

++++ ++-- ---+ +++-
-++- ++++ ++++ ----
---- ++++ +

假设+ 表示已分配,- 表示免费。

我正在寻找如何计算碎片百分比公式

背景

我正在为具有静态内存的嵌入式设备实现微小的动态内存管理。我的目标是拥有一些可以用来存储少量数据的东西。主要是通过无线连接传入的数据包,每个大约 128 字节。

【问题讨论】:

  • 啊……我明白了。这取决于我的分配块有多大。
  • 如果你所有的块大小都差不多,而且你的内存是静态的,而且你的系统太小而不能使用缓存来访问内存,那么碎片可能并不重要——你必须跟踪哪些插槽是免费的,哪些不是,但在访问中跳来跳去应该不会花费你太多。这与机电磁盘驱动器形成鲜明对比,在这种驱动器中,您必须在四处跳动时移动磁头,或者在慢速 DRAM 和 chache 系统中跳动会导致大量缓存未命中。

标签: c memory-management embedded fragmentation


【解决方案1】:

正如 R. 所说,这完全取决于您所说的“碎片百分比”的含义 - 但您可以使用的一个简单公式是:

(free - freemax)
----------------   x 100%    (or 100% for free=0)
    free

在哪里

free     = total number of bytes free
freemax  = size of largest free block

这样,如果所有内存都在一个大块中,碎片是0%,如果内存全部被分割成数百个小块,则接近100%。

【讨论】:

    【解决方案2】:

    计算当前内存布局可以容纳多少个 128 字节数据包。 让这个数字n。

    计算在内存布局中可以容纳多少个 128 字节数据包,分配的字节数与当前分配的字节数相同,但没有空洞(例如,将所有 + 移到左侧)。 假设是那个数字 N。

    你的“碎片率”是 alpha = n/N

    【讨论】:

      【解决方案3】:

      如果您的分配大小都大致相同,只需将您的内存分成TOTAL/MAXSIZE 块,每块由MAXSIZE 字节组成。那么碎片化就无关紧要了。

      一般来说,要回答您的问题,“碎片化”没有神奇的数字。你必须评估不同函数在反映内存碎片化程度方面的优点。这是我推荐的一个,作为大小的函数n

      fragmentation(n) = -log(n * number_of_free_slots_of_size_n / total_bytes_free)
      

      请注意,log 只是用于将事物映射到“0 到无穷大”的比例;您实际上不应该在实践中对此进行评估。相反,您可以简单地评估:

      freespace_quality(n) = n * number_of_free_slots_of_size_n / total_bytes_free
      

      1.0 是理想的(能够分配最大可能数量的大小为n 的对象)而0.0 非常糟糕(无法分配任何对象)。

      【讨论】:

        【解决方案4】:

        如果你有 [++++++--------++++--++-++++++++--------+++++] 并且您想测量可用空间(或任何其他分配)的碎片 您可以测量平均连续块大小 总块数/连续块数。

        在这种情况下 4/(5 + 2 + 1 + 8) / 4 = 4

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-26
          • 2012-10-08
          • 1970-01-01
          • 2014-11-16
          • 2011-04-26
          • 2018-05-24
          • 2012-06-04
          • 2017-03-22
          相关资源
          最近更新 更多