Здесь мой вопрос: освобождает ли звонок или удаляет когда-либо выпуск памяти обратно в "систему". По системе я имею в виду, он когда-либо уменьшает сегмент данных процесса?
Давайте рассмотрим распределитель памяти в Linux, т.е. ptmalloc.
Из того, что я знаю (пожалуйста, поправьте меня, если я ошибаюсь), ptmalloc поддерживает свободный список блоков памяти, и когда приходит запрос на распределение памяти, он пытается выделить блок памяти из этого бесплатного списка (я знаю, распределитель намного сложнее, но я просто помещаю его в простые слова). Если, однако, он не работает, он получает память из системы, используя системные вызовы sbrk или brk. Когда память свободна, этот блок помещается в свободный список.
Теперь рассмотрим этот сценарий, при пиковой нагрузке на кучу выделено много объектов. Теперь, когда нагрузка уменьшается, объекты свободны. Поэтому мой вопрос: после того, как объект свободен, распределитель выполнит некоторые вычисления, чтобы определить, следует ли просто сохранить этот объект в свободном списке или в зависимости от текущего размера бесплатного списка, он может решить вернуть эту память обратно система, то есть уменьшить сегмент данных процесса, используя sbrk или brk.
Документация glibc говорит мне, что если запрос на распределение намного больше размера страницы, он будет выделен с помощью mmap и будет сразу выпущен обратно в систему после free'd. Круто. Но скажем, я никогда не прошу выделить размер больше, чем 50 байтов, и я задаю много таких 50 байтовых объектов при максимальной нагрузке на систему. Тогда что?
Из того, что я знаю (верьте мне, пожалуйста), память, выделенная malloc, никогда не будет выпущена обратно в систему до тех пор, пока процесс не закончится. Если распределитель просто сохранит его в свободном списке, если я его освобожу. Но вопрос, который беспокоит меня, заключается в том, что если я использую инструмент для просмотра использования памяти в моем процессе (я использую pmap в Linux, что вы, ребята, используете?), Он должен всегда показывать память, используемую при максимальной нагрузке ( поскольку память никогда не возвращается в систему, кроме случаев, когда она назначается с помощью mmap)? Это память, используемая процессом, никогда не должна уменьшаться (кроме памяти стека)? Это?
Я знаю, что чего-то не хватает, поэтому прошу пролить свет на все это.
Эксперты, пожалуйста, очистите мои концепции относительно этого. Я буду благодарен. Надеюсь, я смог объяснить свой вопрос.
Спасибо всем за ваше терпение.
Отношения Lali