Почему вызов free () не уменьшает размер кучи? - PullRequest
2 голосов
/ 17 июня 2011

Мы знаем, что стек программы будет увеличиваться или уменьшаться при запуске. В программе на Си, когда мы используем malloc() для выделения памяти, если текущей памяти недостаточно, она вызовет sbrk(), чтобы увеличить размер кучи. Когда мы используем free() для освобождения выделенной памяти, это не уменьшает кучу. Почему не имеет смысла сокращать кучу?

Ответы [ 3 ]

6 голосов
/ 17 июня 2011

Стек не сокращается.Ваше использование стека может быть переменным, но сам стек обычно остается постоянным по размеру.

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

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

for (int i = 0; i < 1000; i++) {
    char *m = malloc (1000000);
    free (m);
}

и подумайте о том, насколько более неэффективно это будет с дополнительной нагрузкой.

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

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

1 голос
/ 17 июня 2011

Когда вы запрашиваете память (например, с помощью malloc), у нее есть два варианта:

  • Если у нее уже достаточно места, «зарезервировано», она просто дает вам эту память
  • Если это не так, он запрашивает операционную систему (используя системный вызов)

Когда вы free память, тот же механизм сохраняет его, на случай, если вы попросите об этом позже.Постоянно беспокоить ОС, запрашивая память / освобождая память, было бы неэффективно.

Очевидно, что поскольку вы говорите о C, стоит упомянуть, что ни один стандарт никогда не будет обеспечивать такое поведение.

0 голосов
/ 17 июня 2011

Как правило, в наши дни не имеет смысла использовать sbrk().Для более глубокого обсуждения этой функции см. этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...