Первое использование malloc устанавливает кучу?

У меня была ошибка, которую я исправил, но мне нужно объяснить ее в отчете.

Я работаю над встроенным устройством под управлением FreeRTOS, которое выполняет собственное управление памятью кучи. FreeRTOS имеет свою собственную версию malloc (), pvPortMalloc (), о которой я не знал, и ее использование устранило проблемы с памятью, которые у меня были.

Мой вопрос касается размера переполнения памяти, которое было вызвано malloc (), размер данных был всего 8 байт, однако размер переполнения был значительным, килобайт, если не больше. Я предполагаю, что первое и единственное использование malloc в этом приложении, установило вторую кучу, конкурирующую с кучей FreeRTOS, размером не менее нескольких килобайт.

Может ли кто-нибудь подтвердить это или дать лучшее объяснение. Указатели на дополнительную информацию или ссылки приветствуются.


person Matt Stevens    schedule 13.09.2014    source источник
comment
По ссылке ниже сравниваются различные подходы к управлению памятью в FreeRTOS. Обсуждаются некоторые известные проблемы с malloc. Это может помочь вам freertos.org/a00111.html   -  person Claudix    schedule 13.09.2014
comment
Та, это был мой источник для выяснения того, как исправить мою ошибку, но он не объясняет поведение, которое я наблюдал.   -  person Matt Stevens    schedule 13.09.2014
comment
Я предполагаю, что это первое и единственное использование malloc в этом приложении. Какое приложение? Пожалуйста, разместите код. В противном случае вопрос будет слишком широким и приведет только к предположениям.   -  person Lundin    schedule 29.09.2014
comment
Итак, что malloc() использовалось до того, как вы перешли на pvPortMalloc()? Кроме того, не совсем ясно, с какой именно проблемой было ваше приложение, когда оно использовало malloc() (в зависимости от того, какая версия была malloc().   -  person Michael Burr    schedule 29.09.2014
comment
См. Ссылку FreeRTOS выше для веб-сайта RTOS и sourceforge.net/projects/freertos для получения их кода. . Кроме того, меня интересует не их реализация, а то, как ведет себя компилятор C.   -  person Matt Stevens    schedule 29.09.2014


Ответы (1)


Это общая черта многих реализаций malloc - запрашивать у системы больший кусок памяти, чем требуется для одного запроса. Например, ptmalloc имеет это:

#define MINIMUM_MORECORE_SIZE  (64 * 1024)

Это служит нижней границей объема памяти (в байтах) для одновременного запроса от ОС (через sbrk()). Таким образом, вы ожидаете увидеть один крошечный результат выделения при «использованных» 64 КБ.

Одна из причин делать такие вещи - уменьшить количество системных вызовов; другой вариант - уменьшить фрагментацию.

person John Zwinck    schedule 29.09.2014
comment
Хорошо, та. Это то, чего я ожидал. Похоже, что это то же самое, что делает pvPortMalloc FreeRTOS, и это объясняет поведение, которое я наблюдаю. Это версия malloc, используемая в C89? - person Matt Stevens; 29.09.2014
comment
Все хорошо, Джон, как только я понял, что искать, найти код glibc было относительно просто, и я нашел предоставленный вами файл. Большое спасибо за указатель :-) - person Matt Stevens; 29.09.2014