реклама на сайте
подробности

 
 
> Аллокатор для Cortex-M3, лучшая стратегия выделения памаяти?
brag
сообщение May 28 2012, 15:16
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Как ни крути, а динамическая память всеравно рано или поздно становится необходимой...
Готовые реализации использовать не могу по многим причинам(необходимость иметь несколько арен, thread-safety итп).
Нужен аллокатор, который будет давать минимальную фрагментацию в реальных условиях,минимальный обьем служебной памяти, производительность не особо важна, тк размер арены от силы 32кб.

Реальные условия - одни блоки памяти живут практически forever, другие выделяются/освобождаются подобно стековым переменным - в начале/конце функции соответственно. Блоки разной длины, от 16 до 1024 байт, редко больше. Юзать стек для этого не канает, тк нужно резервировать большие стеки для каждого потока, а это память будет использована на 5-10% в 90% времени.
В основном такое поведение имеет место в GUI и всяких обменах сообщениями, где сами алгоритмы гораздо тяжелее, чем аллокатор.

Пока сделал классическую реализацию best-fit, из служебных полей только размер,бит free/used в начале и в конце блока для облегчения free() и слияния соседних пустых блоков, тобышь заголовок весит 8 байт. Работает все гуд, но хз как оно будет при длительной работе девайса(ну там месяц,2,3).
Курил всякие разные реализации, но там делается упор в основном на производительность, а про фрагментацию редко где упоминается.
По рандом-бенчмаркам best-fit типа рулит, но смущает его тенденция к накоплению кучи маленьких(малоюзабельных) блоков.
First-fit, даже на простых тестах в моих реальных условиях показал гораздо худшую фрагментацию, чем best-fit. next-fit еще хуже.

Если кто-то имел дело с использованием,разработкой аллокаторов - буду благодарен за любую информацию...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Forger
сообщение May 28 2012, 15:37
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(brag @ May 28 2012, 19:16) *
Если кто-то имел дело с использованием,разработкой аллокаторов - буду благодарен за любую информацию...


Я в свое время заморачивался, даже делал дефрагментатор, но это оказалось ненадежным, потому как в таких системах сложно добится детерменирванного времени захвата/высвобождения куска памяти.
По сему я остановился на варианте т.н. pool памяти, но таких пулов не один, а несколько - каждый имеел различный размер кусочков (slice).
Так же был диспетчер всех этих пулов, который сам выбирал при захвате пул с наиболее подходящим размером кусочка.
Т.е. в каждом пуле кусочки равного размера в пределах самого пула, но у каждого пула свой размер кусочков.
Так же этот диспетчер собирал статистику в рабочем режиме, и пре перезапуске прошивки автоматически создавал пулы с размерами кусочков и их числом на основании статистики последнего сеанса работы прошивки (статистика писалась в eeprom).
Пул-память дает четко детерменированное время захвата/освобождения кусочков.
Да и фрагментация как таковая тут полностью отсутствует.
Работало вполне эффективно.
Потом я это переписал на С++ с использованием smart pointer, стало еще удобнее работать - в коде нигде не было new/delete, куски сами освобождались, если на них уже никто не ссылался. Ориентировалось под применение RTOS, хотя можно и без нее.
А обычная куча со всеми ее недостатками, имхо, во встраиваемых приложениях - капризная и ненадежная вещь, уж лучше тогда взять проц с большим объемом памяти, чем кучу использовать. Я стараюсь избегать кучи в embedded проектах.
Ну как-то так sm.gif



--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- brag   Аллокатор для Cortex-M3   May 28 2012, 15:16
|- - AlexandrY   Цитата(Forger @ May 28 2012, 18:37) По се...   May 29 2012, 06:31
||- - Forger   Цитата(AlexandrY @ May 29 2012, 10:31) Ка...   May 29 2012, 08:08
|- - SasaVitebsk   Цитата(Forger @ May 28 2012, 18:37) А обы...   May 29 2012, 13:42
- - brag   Спасибо. Дефрагментатор не годится, тк мы не може...   May 28 2012, 16:28
|- - Forger   Цитата(brag @ May 28 2012, 20:28) А про н...   May 28 2012, 17:01
- - brag   по кучам перечитал всякого много, в тч. Кнута и вс...   May 28 2012, 17:08
- - scifi   Цитата(brag @ May 28 2012, 19:16) Реальны...   May 28 2012, 18:24
- - brag   Чистый стек не идет. Потоков много, вызывающих одн...   May 28 2012, 18:46
|- - jcxz   Цитата(brag @ May 29 2012, 00:46) Чистый ...   May 29 2012, 02:24
|- - neiver   Цитата(brag @ May 28 2012, 22:46) Чистый ...   May 29 2012, 11:50
- - brag   ЦитатаРаз у вас не хватает памяти чтобы распредели...   May 29 2012, 13:15
|- - jcxz   Цитата(brag @ May 29 2012, 19:15) Таки ва...   May 29 2012, 15:19
|- - ReAl   Цитата(jcxz @ May 29 2012, 18:19) char bu...   May 29 2012, 18:13
- - brag   Касты с char не прокатят, char buf[ sizeof(ClassNa...   Jun 7 2012, 12:49


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01407 секунд с 7
ELECTRONIX ©2004-2016