如何计算碎片?

时间:2011-01-03 18:03:57

标签: c memory-management embedded fragmentation

想象一下,你有一些包含大量字节的内存:

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

我们说+表示已分配,-表示免费。

我正在搜索如何计算碎片百分比公式

背景

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

4 个答案:

答案 0 :(得分:7)

正如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%。

答案 1 :(得分:6)

计算当前内存布局中可容纳的128个字节数据包数。 我是那个数字。

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

您的“碎片比例”将为alpha = n / N

答案 2 :(得分: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非常糟糕(无法分配任何对象)。

答案 3 :(得分:0)

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

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