2013-11-14 1 views
6

Как фактически malloc получает доступное свободное пространство памяти в микроконтроллере. Сохраняет ли он список областей, не распределенных непрерывно во время выполнения? Как получить информацию о предыдущем распределении памяти назначения malloc, если в коде есть два оператора malloc.Как malloc знает текущие свободные ячейки памяти

Как узнать, какая память свободна и какой из них нет во время выполнения. Во время компиляции мы можем знать, какие все места в ОЗУ назначаются компилятором для переменной. Использует ли malloc эту информацию для этого.

+2

зависит от цели. Не все реализации одинаковы. –

+0

Попробуйте прочитать это сообщение: http://stackoverflow.com/q/5422061/10077 –

+0

Iam новичок в этой области, пожалуйста, простите, если мой вопрос неверен. Фактически в случаях, когда объем необходимой памяти может быть известен только во время выполнения. Поэтому, когда требуется память, «найдите блок, достаточно большой, чтобы удовлетворить запрос». Как узнать, какая память свободна, а какая - нет во время выполнения. Во время компиляции мы можем знать, какие все места в ОЗУ назначаются компилятором для переменной. Использует ли malloc эту информацию для этого. Мой английский плохой, если вопрос непонятен, сообщите мне. –

ответ

3

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

Простыми словами, все реализации malloc резервируются с помощью схем управления памятью ядра. Ядро видит всю системную память как страницы фиксированного размера (4k, 8k и т. Д.), И все распределения и освобождения выполняются на страницах. Будет существовать подсистема управления памятью для всех реализаций ядра и которая выполняет учет распределений и освобождений всей памяти в системе. Когда вы вызываете malloc, он в конечном итоге достигнет этой подсистемы управления памятью и ищет следующую свободную страницу из пула и выделяет для процесса запроса. Прежде чем передать страницу реквестору, он обязательно отметит ее как использованную и таким же образом, когда вы освободите память, она добавит ее обратно в свободный пул и удалит отметку. Существует так много реализаций о том, как ядро ​​делает все это эффективно (чтение в реализациях диспетчера памяти в Linux)

В обычных реализациях существует минимальная функциональность менеджера памяти в самом пользовательском пространстве. Сам процесс пользовательского пространства поддерживает свободный пул, и когда malloc запрашивает память, прежде чем входить в ядро, он будет искать в своем собственном свободном пуле, если память доступна. Если он доступен, он будет отмечать его и удовлетворяет запросу без помощи ядра. Точно так же, когда вы освобождаете память, освобожденный кусок памяти не сразу вернется в свободный пул ядра, а останется в свободном пуле процесса, чтобы следующий malloc мог использовать это.

Как я уже сказал в начале, это огромная и сложная тема, и вы можете найти много документов, доступных в Интернете об этом.

Смежные вопросы