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