想象一下,你有一些包含大量字节的内存:
++++ ++-- ---+ +++-
-++- ++++ ++++ ----
---- ++++ +
我们说+
表示已分配,-
表示免费。
我正在搜索如何计算碎片百分比的公式。
背景
我正在为具有静态内存的嵌入式设备实施微小的动态内存管理。我的目标是拥有一些可用于存储少量数据的东西。主要通过无线连接传入数据包,每个数据包大约128字节。
答案 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