Очистка памяти в оперативной памяти? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть некоторый код на c ++, который используется для выделения памяти и освобождения ее, хотя ОЗУ не очищается сразу ... Мои сомнения (я использую ОС Linux)

1) - операционная система занимаетвремя освободить память, которая освобождается?

2) Как заставить ОЗУ очистить освобожденную память через промежутки времени?

Спасибо

1 Ответ

0 голосов
/ 09 октября 2018

Тема освобождения памяти сложнее, чем вы ожидаете.Есть целых статей , посвященных политикам выделения и освобождения.

Обычно большие блоки выделяются с помощью mmap (файл отображения памяти), который немедленно освобождается с помощью free. Маленькие порции памяти вырезаны из большой порции кучи, размер которой управляется семейством функций sbrk.

Освобождение памяти, выделенной из большой кучи, обычно выполняется путем помещения освобожденного фрагмента в список свободных (или аналогичный).Свободный список управляется библиотекой C и не освобождается ядром через sbrk.Процесс держит освобожденный кусок бесконечно.

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

Проверьте mallopt для Linux, чтобы узнать, как контролировать агрессивность политики выпуска free.Обратите внимание, что этот вызов не переносим и изменяется от одной операционной системы к другой.Кроме того, malloc_trim(0) - это непереносимый, только для Linux, способ заставить библиотеку C вернуть всю память, которую она может, обратно в ОС.Скорее всего, ваша операционная система имеет аналогичный непереносимый вызов для тех же целей.

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

Единственный способ принудительно освободить память - это управлять ею напрямую, полностью избегая malloc / free.Вы можете выделить большой кусок памяти через mmap, а затем разархивировать его, когда закончите.При наличии запаса malloc / free очень трудно убедиться, что выделение (и освобождение) выполняется в LIFO (последний пришел первым вышел), иначе будет небольшой блок памяти, препятствующий освобождению памяти для ОС.

примечание

Детали отличаются в разных операционных системах.Системы Windows и POSIX имеют разные политики и разные примитивы отображения памяти.В ОС без виртуальной памяти, такой как DOS, вся память может быть немедленно возвращена ОС (без mmap и sbrk).

...