Встроенный Linux: фрагментация памяти - PullRequest
2 голосов
/ 17 января 2011

Во многих встроенных системах фрагментация памяти является проблемой. В частности, для программного обеспечения, которое работает в течение длительных периодов времени (месяцы, годы и т. Д.). Для многих проектов решение состоит в том, чтобы просто не использовать динамическое распределение памяти, такое как malloc / free и new / delete. Глобальная память используется, когда это возможно, и пулы памяти для типов, которые часто выделяются и освобождаются, являются хорошими стратегиями, позволяющими избежать использования динамического управления памятью.

В Embedded Linux как это решается? Я вижу, что многие библиотеки используют динамическую память. Есть ли механизм, который ОС использует для предотвращения фрагментации памяти? Периодически очищает кучу? Или следует избегать использования этих библиотек во встроенной среде?

Ответы [ 3 ]

2 голосов
/ 17 января 2011

Не существует неподвижного распределителя памяти, который мог бы избежать фрагментации, по меньшей мере, коэффициента логарифма (М / м), где М = размер наибольшего запроса объекта и m = размер наименьшего (этоклассический результат из-за Робсона, 1971).

Я работаю с людьми, которые занимаются системным программированием в реальном времени (в том числе в Airbus), и они старательно избегают использования динамического распределения памяти, вместо этого используют пулы, как вы упоминаете.

Однако существует большая разница между ОС и распределением памяти.Динамическое распределение памяти, предоставляемое программисту, является частью библиотеки и имеет мало общего с ОС (кроме как в качестве источника памяти).Сам Linux использует распределитель памяти на основе slab для своих внутренних целей;Я предполагаю, что Embedded Linux делает то же самое, но я не уверен.

1 голос
/ 01 февраля 2011

Это зависит от того, как вы используете память.

В большинстве случаев Linux использует виртуальную память, в которой приложение видит память как непрерывный блок памяти. Базовое ядро ​​выполняет все ручное отображение между виртуальной памятью и физической памятью, так что вам не придется иметь с этим дело. Физически ваша память может разбросаться, но ваши приложения этого не видят.

А что если вам действительно нужна непрерывная физическая память? Это часто случается, когда вы хотите выполнить DMA или другие жесткие требования к вашему оборудованию. В этом случае вам разрешено выделять страницу памяти, которая указывает на конкретную физическую память. Но вы должны сделать это как исключение, кроме нормы.

Я спроектировал свою систему таким образом, чтобы большинство драйверов (кроме драйвера «реального времени») находилось в пространстве пользователя. Таким образом, вы получаете все преимущества пользовательского пространства (больше библиотек, языков), не убивает ядро, если у вас есть ошибка, и использует доступную виртуальную память.

1 голос
/ 17 января 2011

ИМХО, в любом случае вы можете искать алгоритмы выделения памяти, которые вызывают меньшую фрагментацию. И настройте этот алгоритм или реализацию распределения памяти после измерения требований к памяти.

Я могу рекомендовать TLSF в качестве начала.

...