LINUX.ORG.RU

Когда система забирает назад память у процесса?

 , ,


1

2

Освободил я, значит, память процесса через free или delete. Проверил Valgrind'ом - чисто, пишет.

В диспетчере задач (неважно, какой ОС) всегда вижу, что размер памяти, занятой процессом, как был на одном уровне, так и остался.

Но взять, например, Firefox - у него после закрытия пары вкладок сразу падает потребление памяти. Т.е. операционная система освобожденные страницы памяти забирает.

В связи с чем вопрос - есть ли какие-то способы заставить ОС принудительно забрать обратно освобождённую память? Есть ли какие-то стандарты, описывающие, когда ОС забирает память назад, а когда нет? Есть ли какие-то различия в этом для различных ОС?

UPD: Решено.

Вариант1: Использовать свои менеджеры памяти, отличные от free/delete

Вариант2:

When the amount of contiguous free memory at the top of the
heap grows sufficiently large, free(3) employs sbrk(2) to
release this memory back to the system.  (This can be useful
in programs that continue to execute for a long period after
freeing a significant amount of memory.)  The M_TRIM_THRESHOLD
parameter specifies the minimum size (in bytes) that this
block of memory must reach before sbrk(2) is used to trim the
heap.
★★★

Последнее исправление: Adonai (всего исправлений: 1)

есть ли какие-то способы заставить ОС принудительно забрать обратно освобождённую память?

Зачем? Ты не переживай, она все возьмет, когда ей потребуется.

staseg ★★★★★
()
Ответ на: комментарий от Adonai

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

staseg ★★★★★
()
Ответ на: комментарий от staseg

Почему же глупость, я то же самое совсем недавно читал.

Но опять же, хитрый лис Firefox не даёт мне спокойно спать

Adonai ★★★
() автор топика

Но взять, например, Firefox

емнип, у браузеров какие-то свои либы/костыли для распределения памяти используются(?)

cryptohedge
()
Ответ на: комментарий от staseg

Ну и плюс, для чистоты эксперимента нужно аллоцировать и освобождать страницы памяти, а не всякую ерунду malloc-ом. (mmap)

staseg ★★★★★
()

free/delete не любят возвращать память ОС (хотя емнип могут в некоторых ситуациях). Но приложение может использовать собственный менеджер памяти на основе mmap/munmap и явно возвращать память.

unsigned ★★★★
()

Когда угодно системе(

(неважно, какой ОС)

).

В связи с чем вопрос - есть ли какие-то способы заставить ОС принудительно забрать обратно освобождённую память?

да. завершить процесс например, ос канибализирует ресурсы ставшие безхозными достоверно.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Ну, меня интересовала все же освобожденная, а не занятая

Adonai ★★★
() автор топика

Система забирает память у процесса тогда, когда сочтет нужным.

В диспетчере задач (неважно, какой ОС) всегда вижу, что размер памяти, занятой процессом, как был на одном уровне, так и остался.

Интересно, что ты называешь " размер памяти, занятой процессом".

tailgunner ★★★★★
()

Когда система забирает назад память у процесса?

Дык это. Ты не путай виртуальную и физическую память.

Виртуальную память процесс сам отдаёт, когда сочтёт нужным. Если говорить точнее, аллокатор памяти в glibc просит у ядра память большими кусками, которую потом раздаёт уже маленькими кусками по запросам через malloc. Когда же ты через free() освобождаешь память, аллокатор в glibc может отдать память ядру, а может и не отдать, это на его усмотрение.

А вот физическую память ядро даёт и забирает в любое время. Например, ядро может выкинуть страницы в своп, и процесс будет сидеть в обработчике страничного исключения и ждать, пока память вернётся. Всё это происходит прозрачно для твоей программы.

anonymous
()
Ответ на: комментарий от anonymous

Да, благодарю за уточнение, я о виртуальной.

Adonai ★★★
() автор топика
Ответ на: комментарий от Adonai

Стэк+хип?

Если это вопрос, то ответ «нет».

я о виртуальной.

Виртуальную память система не забирает никогда. Процесс может отдать ее добровольно.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Виртуальную память система не забирает никогда. Процесс может отдать ее добровольно.

OOM Killer

Adonai ★★★
() автор топика
Ответ на: комментарий от Adonai

Если в твоей системе OOM Killer забирает память _у процесса_, окей.

tailgunner ★★★★★
()
Ответ на: комментарий от buddhist

All you need is Love, Love is all you need.

The world is full of Kings and Queens
Who blind your eyes and steal your dreams

x905 ★★★★★
()

хинт: firefox использует аллокатор jemalloc

crowbar
()

Аллокатор (свой или стандартный) может отдать память сделав munmap или madvise(MADV_FREE). Скорее второе, потому что mmap'аются обычно больные куски виртуальной памяти и вероятность получить полностью свободный кусок мала (разве что для больших единичных аллокаций), да и отдавать виртуальную память нужды вообще нет, физическую - пожалуйста. А так, как уже сказали, система сама берёт физическую, выкидывая страницы в swap когда её надо.

slovazap ★★★★★
()
Ответ на: комментарий от qulinxao

Блин, какие книги надо читать, что бы так писать? ;)

nanoolinux ★★★★
()
Ответ на: комментарий от anonymous

При чём тут своп? После MADV_FREE ни физические страницы ни своп не используются, от страницы остаётся только запись в каталоге. Можно было бы говорить разве что об экономии адресного пространства (неактуально на 64битных архитектурах, да и, опять же, оно не теряется а используется аллокатором) и места в TLB (тоже едва ли заметно, особенно с учётом huge pages).

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

А, так ты под физической памятью в том числе понимаешь в том числе своп? Тогда, признаю был не прав.

anonymous
()

Ну большинство программистов предпочитают НЕ отдавать память, т.к. она может скоро понадобится. Причём только что отданная память самая быстрая (т.к. в кешах).

А у браузера особый случай, очень мало вероятно, что ты вкладку закрыл что-бы её опять открыть. Вот браузер и отдаёт всё.

emulek
()
Ответ на: комментарий от anonymous

Действительно. Похоже её имплементят кто во что горазд, что странно учитывая что функция описана в стандарте. Судя по манам, то что под FreeBSD делает MADV_FREE под Linux делает MADV_DONTNEED.

Посмотрел ради интереса jemalloc - он об этом знает и прям явно содержит дефайны для этих различий:

bool
pages_purge(void *addr, size_t length)
{
    bool unzeroed;

#ifdef _WIN32
    VirtualAlloc(addr, length, MEM_RESET, PAGE_READWRITE);
    unzeroed = true;
#else
#  ifdef JEMALLOC_PURGE_MADVISE_DONTNEED
#    define JEMALLOC_MADV_PURGE MADV_DONTNEED
#    define JEMALLOC_MADV_ZEROS true
#  elif defined(JEMALLOC_PURGE_MADVISE_FREE)
#    define JEMALLOC_MADV_PURGE MADV_FREE
#    define JEMALLOC_MADV_ZEROS false
#  else
#    error "No method defined for purging unused dirty pages."
#  endif
    int err = madvise(addr, length, JEMALLOC_MADV_PURGE);
    unzeroed = (JEMALLOC_MADV_ZEROS == false || err != 0);
#  undef JEMALLOC_MADV_PURGE
#  undef JEMALLOC_MADV_ZEROS
#endif
    return (unzeroed);
}
slovazap ★★★★★
()
Ответ на: комментарий от emulek

очень мало вероятно, что ты вкладку закрыл что-бы её опять открыть

Да ни фига. Если новых вкладок уже не будет открываться, то скорее всего, браузер скоро вообще закроется и смысла срочно освобождать часть памяти нет. Если же браузер открыт и используется, то вполне вероятно, что что-нибудь будет открыто в новой вкладке снова и снова, чай, не IE6 же. Да и при переходе между страницами в пределах вкладки память тоже высвобождается-заполняется, а поскольку жирность у современных веб-страниц колеблется в О-О-ОЧЕНЬ широких пределах, нехилая часть памяти, выделенной на жирную страницу, при уходе с неё на лёгкую окажется невостребованной.

MiniRoboDancer ★☆
()
Ответ на: комментарий от MiniRoboDancer

Да ни фига.

ну иди скажи это разрабам браузеров. Мне-то зачем? Я память не освобождаю принудительно.

emulek
()
Ответ на: комментарий от slovazap

Ну что это POSIX я и сам догадался. Где почитать?

Кстати, man posix_madvise не содержит MADV_FREE.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.