2011-01-17 4 views
2

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

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

ответ

2

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

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

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

+0

Что делают эти ребята из Airbus, когда они сталкиваются с библиотекой, использующей динамическую память? – waffleman

+1

AFAIK, это обстоятельство никогда не возникает. – EmeryBerger

1

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

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

1

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

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

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

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

+0

Можете ли вы предоставить дополнительную информацию о том, как «распределить страницу памяти, указывающую на определенную физическую память»? –

+0

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

+0

Daryl, используйте/dev/mem для доступа к физическому адресу из пользовательского пространства. – KOkon

 Смежные вопросы

  • Нет связанных вопросов^_^