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

 
 
> Аллокатор для 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
AlexandrY
сообщение May 29 2012, 06:31
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Forger @ May 28 2012, 18:37) *
По сему я остановился на варианте т.н. pool памяти, но таких пулов не один, а несколько - каждый имеел различный размер кусочков (slice).
Так же был диспетчер всех этих пулов, который сам выбирал при захвате пул с наиболее подходящим размером кусочка.

Работало вполне эффективно.


Как вы, интересно, определили его эффективность.
Как то не приходилось видеть движков которые бы сами эффективно могли бы создавать правильные распределения пулов фиксированного размера.
Да и сомнительно насчет сбора статистики. Сама такая статистика требует heap-а неопределенного размера.
А если все таки статистика была компактной, то какой смысл был ее собирать, анализ исходников ответил бы на все вопросы.

Go to the top of the page
 
+Quote Post
Forger
сообщение May 29 2012, 08:08
Сообщение #4


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

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



Цитата(AlexandrY @ May 29 2012, 10:31) *
Как вы, интересно, определили его эффективность.

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

Вообще, в моих реальных проектах это нафик не было нужно: я просто закладываю больше памяти.
Так выходит быстрее, проще и надежнее sm.gif А цена ОЗУ? Так в моих проектах она вообще некритична - мелкосерийные изделия, епта.

Цитата
Как то не приходилось видеть движков которые бы сами эффективно могли бы создавать правильные распределения пулов фиксированного размера.
Да и сомнительно насчет сбора статистики. Сама такая статистика требует heap-а неопределенного размера.

Да не было там чего-то заумного, просто алгоритм был ориентирован на минимизацию использования памяти самим приложением.
К сожалению, не сохранились те исходники... sad.gif

Цитата
А если все таки статистика была компактной, то какой смысл был ее собирать, анализ исходников ответил бы на все вопросы.

Мне кажется, что анализ исходников не даст полной картины в многопоточном приложении, в динамике.
Но анализ кода даст точную картину при статических объектах, да и это сам компилятор/линкер дает sm.gif


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

Сообщений в этой теме
- brag   Аллокатор для Cortex-M3   May 28 2012, 15:16
|- - 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 Текстовая версия Сейчас: 21st July 2025 - 07:35
Рейтинг@Mail.ru


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