Использование mallo c в режиме реального времени - PullRequest
1 голос
/ 29 января 2020

У нас была проблема с одним из наших приложений в реальном времени. Идея состояла в том, чтобы запускать один из потоков каждые 2 мс (500 Гц). После того, как приложение запустилось на полчаса, так что .. мы заметили, что поток отстает.

После нескольких обсуждений люди жалуются на выделения mallo c в потоке реального времени или root причина - выделения mallo c.

Мне интересно, всегда ли стоит избегать динамического выделения памяти c в потоках реального времени?

Inte rnet имеет очень мало ресурсов для этого? Если вы можете указать на некоторые обсуждения, мы бы тоже здорово ..

Спасибо

1 Ответ

3 голосов
/ 29 января 2020

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

Я сомневаюсь, что malloc займет любую значительную часть этих 2 мс на разумном микроконтроллере, способном работать Linux; Я бы сказал, что вам скорее всего не хватит памяти из-за фрагментации, чем из-за проблем с производительностью. Если у вас есть другие системные вызовы в вашей функции, они легко примут на порядок больше, чем malloc.

Но если malloc действительно проблема, в зависимости от того, насколько недолговечны ваши объекты, сколько памяти вы можете позволить себе потратить впустую, и насколько ваши потребности известны заранее, есть несколько подходов, которые вы можете использовать:

  1. Распределение общего назначения (malloc из вашей стандартной библиотеки или любой другой сторонней реализации): наилучший подход, если у вас есть «более чем достаточно» ОЗУ, много недолговечных объектов и нет строгих требований к задержке

    • PROS: работает для любой размер объекта из коробки, знакомый интерфейс, память распределяется динамически, нет необходимости «планировать заранее», если память не является проблемой
    • CONS: небольшое снижение производительности во время выделения и / или освобождения, проблемы фрагментации памяти при выполнении большого количества выделений / освобождений объектов разных размеров, неудача выделения во время выполнения менее определена inisti c и не может быть легко устранено во время выполнения
  2. Пул памяти : наилучший подход в большинстве случаев, когда память ограничена, требуется низкая задержка, и объект должен жить дольше, чем единичная область видимости

    • PROS: время выделения / освобождения гарантируется равным O(1) в любой разумной реализации, не страдает от фрагментации, легче планировать его размер заранее, неудача в распределении во время выполнения (вероятно) легче смягчить
    • CONS: работает для одного определенного c размера объекта - память не распределяется между другими частями программы, требует планирования для правильного размера пула или риска потенциальной растраты памяти
  3. Объекты на основе стека (автоматизация c -дурации) : лучше для меньших, недолговечные объекты (единичная область видимости)

    • PROS: выделение и освобождение осуществляется автоматически, позволяет оптимально использовать ОЗУ для срока службы объекта, тыс. грн. Это инструменты, которые иногда могут выполнить c анализ вашего кода и оценить размер стека
    • CONS: объекты ограничены областью действия одного блока - не могут совместно использовать объекты между вызовами прерываний
  4. Отдельные статически распределенные объекты : лучший подход для долгоживущих объектов

    • PROS: никакого выделения вообще нет - все необходимые объекты существуют на протяжении всего жизненного цикла приложения , нет проблем с выделением / освобождением
    • CONS: тратит память, если объекты должны быть недолговечными

Даже если вы решите go для памяти Объединяйте программы по всей программе, убедитесь, что вы добавили профилирование / инструментарий в свой код. А затем навсегда оставьте его там, чтобы увидеть, как со временем меняется производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...