ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
22 июля
1048812 Топик полностью
fk0, легенда (02.11.2020 13:24, просмотров: 166) ответил SciFi на Куча фрагментируется. То есть сумма размеров свободных кусков и размер максимального свободного куска — это не одно и то же. Ну и есть ли смысл выделять буфер недетерминированного размера? Как-то это не по-ымбеддерски. Типа сегодня работает, а завтра нет. Или наеборот.
A как по-ембеддерски? Ставить лишние пару мегабайт внешней статической памяти? Очевидно, что при использовании динамически выделяемой памяти нужен определённый подход: 

1) нужен какой-то сценарий на случай, если вдруг память выделить не удалось;


2) нужнен сценарий и/или доказательство того, что память не будет сильно фрагментирована и работа сможет быть продолжена;


3) нужна оценка минимального объёма памяти, который гарантировано должен быть доступен;


4) нужны, возможно, какие-то способы борьбы с фрагментацией (если выделяются очень большие объёмы, в характерной последовательности и долгое время не освобождаются).


По пункту 1 -- типичным способом обхода может быть повтор операции через некоторое время... для многих операций это запросто возможно. Для тех, где невозможно -- память должна быть выделена заранее (в начале цикла работы и т.п.)


По пункту 2 -- большинство приборов или алгоритмов управления работает циклически. И если основной объём памяти в конце цикла полностью освобождается, то нет проблем. Запросто можно использовать динамический аллокатор для короткоживущих аллокаций. Для долгоживущих возможно имеет смысл их аллоцировать заранее (при старте программы, при старте какой-либо функции, создании класса...), чтоб они не попадали в перемешку с другими блоками и таким образом увеличивали фрагментацию.


По пункту 3 -- это то, о чём хотел спросить автор темы, очевидно... Он не знает сколько ему отдать под пул динамической памяти. На самом деле ответ здесь простой: отдать нужно всю свободную память. И из динамической памяти уже выделять всё остальное (может быть однократно, на старте программы). Обычно сверху-вниз растёт стек, а снизу-вверх динамическая память. И когда они встречаются: всё взрывается.


По пункту 4 -- качественный аллокатор (вроде аллокатора им. Doug Lee, а не то, что дают с компиляторами проф. уровня) часто имеет достаточно хорошую стратегию аллокации, борющуюся с фрагментацией. Но возможны ситуации, когда выделяются очень большие (более 10% от всего пула динамической памяти, например) и долгоживущие блоки данных. Для таких блоков следует предусмотреть другой способ аллокации. Например, предусматривающий перемещение блоков в памяти (пока их не используют). Тогда проблема фрагментации решается.


Вдогонку: нужно закладывать ~150-200% от памяти оцененной в пункте 3. Кроилово ведёт к попадалову.

[ZX]