Как рассчитать фрагментацию?

Изображения у вас есть память, содержащая байты: [++++++ ----- ++++ - ++ - ++++++++ -------- ++ +++]

Скажем, "+" означает выделение, а "-" означает свободный.

Я ищу формулу для вычисления процента фрагментации.

Фон: я реализую крошечное управление динамической памятью для встроенного устройства со статической памятью. Моя цель - иметь что-то, что я могу использовать для хранения небольших объемов данных. В основном входящие пакеты по беспроводному соединению ~ 128 байтов каждый.

Благодарим вас за помощь.

Ответ 1

Как говорит Р., это зависит от того, что вы подразумеваете под "процентом фрагментации", но одна простая формула, которую вы могли бы использовать, была бы следующей:

(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.

Ваш "коэффициент фрагментации" будет равен альфа = 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