Десинициализация области памяти
За последние несколько дней я узнал проблему с перегрузкой памяти (когда активирована перегрузка памяти, которая обычно используется по умолчанию), что в основном означает, что:
void* p = malloc(100);
Оперативная система дает вам 100 смежных (виртуальных) адресов, взятых из (виртуального) адресного пространства вашего процесса, общий диапазон которого определяется ОС. Поскольку эта область памяти еще не была инициализирована, она не считается неиспользуемым хранилищем с общесистемной точки зрения, так что это чистая абстракция помимо использования ваших виртуальных адресов.
memset(p, 0, 5);
При этом используются первые 5 байтов, поэтому, с точки зрения ОС, ваш процесс теперь занимает 5 дополнительных байтов, и поэтому система имеет на 5 байтов меньше свободной памяти. У вас осталось 95 байт неинициализированного хранилища.
Система аварийно завершает работу или запускает процессы уничтожения только тогда, когда объединенное хранилище (инициализированное) каждого процесса находится за пределами возможностей ОС.
Если мое понимание верно в этом отношении, есть ли способ "де-" инициализировать область памяти, когда вы закончите с ней, чтобы увеличить свободное пространство в системе, не теряя область адреса, запрошенную malloc
или же aligned_malloc
(чтобы вы не увеличивали фрагментацию с течением времени)?
Цель этого вопроса скорее теоретическая, чем практическая, и не о "освобождении памяти", а об освобождении памяти при сохранении уже назначенных виртуальных адресов.
Источник о разнице между запросом виртуальных адресов и рабочим пространством: https://www.win.tue.nl/~aeb/linux/lk/lk-9.html
П.Д.: Зная, что Linux наполнит мое любопытство, я в порядке.
1 ответ
Нет, нет пути.
В большинстве систем, как только вы распределяете память, она засчитывается в ОЗУ или подкачку.
Как показывает ваша ссылка, в Linux вам может понадобиться один раз получить доступ к памяти, чтобы она фактически была выделена. Но как только вы это сделаете, система должна где-то сохранить эту память, на случай, если вы получите к ней доступ позже.
Способ сообщить системе, что вы сделали с памятью, - на самом деле освободить ее.