Как отмечают комментаторы, существует множество реализаций malloc, и алгоритм может значительно варьироваться для каждой из этих реализаций. Это обширная и сложная область, и вы должны прочитать руководство по управлению памятью, чтобы получить полную идею по этой теме.
Простыми словами, все реализации malloc резервируются с помощью схем управления памятью ядра. Ядро видит всю системную память как страницы фиксированного размера (4k, 8k и т. Д.), И все распределения и освобождения выполняются на страницах. Будет существовать подсистема управления памятью для всех реализаций ядра и которая выполняет учет распределений и освобождений всей памяти в системе. Когда вы вызываете malloc, он в конечном итоге достигнет этой подсистемы управления памятью и ищет следующую свободную страницу из пула и выделяет для процесса запроса. Прежде чем передать страницу реквестору, он обязательно отметит ее как использованную и таким же образом, когда вы освободите память, она добавит ее обратно в свободный пул и удалит отметку. Существует так много реализаций о том, как ядро делает все это эффективно (чтение в реализациях диспетчера памяти в Linux)
В обычных реализациях существует минимальная функциональность менеджера памяти в самом пользовательском пространстве. Сам процесс пользовательского пространства поддерживает свободный пул, и когда malloc запрашивает память, прежде чем входить в ядро, он будет искать в своем собственном свободном пуле, если память доступна. Если он доступен, он будет отмечать его и удовлетворяет запросу без помощи ядра. Точно так же, когда вы освобождаете память, освобожденный кусок памяти не сразу вернется в свободный пул ядра, а останется в свободном пуле процесса, чтобы следующий malloc мог использовать это.
Как я уже сказал в начале, это огромная и сложная тема, и вы можете найти много документов, доступных в Интернете об этом.
зависит от цели. Не все реализации одинаковы. –
Попробуйте прочитать это сообщение: http://stackoverflow.com/q/5422061/10077 –
Iam новичок в этой области, пожалуйста, простите, если мой вопрос неверен. Фактически в случаях, когда объем необходимой памяти может быть известен только во время выполнения. Поэтому, когда требуется память, «найдите блок, достаточно большой, чтобы удовлетворить запрос». Как узнать, какая память свободна, а какая - нет во время выполнения. Во время компиляции мы можем знать, какие все места в ОЗУ назначаются компилятором для переменной. Использует ли malloc эту информацию для этого. Мой английский плохой, если вопрос непонятен, сообщите мне. –