В какой момент физическую память возвращают системе
На практике уловить момент, подходящий для возврат памяти, - штука непростая. Вернемся к примеру с электронной таблицей. Если программа работает на машине с процессором x86, размер каждой страницы памяти — 4 Кб, т e. на одной странице умещается 32 (4096 / 128) структуры CELLDATA. Если пользователь удаляет содержимое элемента CellData[0][l], Вы можете вернуть страницу памяти, но только при условии, что ячейки в диапазоне от CellData[0][0] до CellData[0][31] тоже не используются. Как об этом узнать? Проблема решается несколькими способами.
При выполнении программы Вы будете периодически вызывать функцию сбора мусора, которая должна просматривать все структуры.
Для каждой структуры (и существующей, и той, которая может быть создана) функция сначала определяет, передана ли под нее память; если да, то проверяет значение fInUse. Если оп равен 0, структура не используется; TRUE — структура занята. Проверив все структуры, расположенные в пределах заданной страницы, функция сбора мусора вызывает VirtualFree, чтобы освободить память, — если, конечно, па этой странице нет используемых структур.
Функцию сбора мусора можно вызывать сразу после того, как необходимость в одной из структур отпадет, но делать так не стоит, поскольку функция каждый раз просматривает все структуры — и существующие, и те, которые могут быть созданы. Оптимальный путь — реализовать эту функцию как поток с более низким уровнем приоритета. Это позволит не отнимать время у потока, выполняющего основную программу. А когда основная программа будет простаивать или ее поток займется файловым вводом-выводом, вот тогда система и выделит время функции сбора мусора.
Лично я предпочитаю первые два способа. Однако, если Ваши структуры компактны (меньше одной страницы памяти), советую применять последний метод:
{375}