Если в вашей программе так много вызовов malloc
и free
, что вы получаете такую фрагментацию, использование mmap
для каждого выделения будет безнадежно медленным. Вместо этого вам нужно измерить, что вызывает фрагментацию памяти и исправить это. Сначала я бы использовал такой инструмент, как valgrind, чтобы убедиться, что это не проблема утечки / повреждения памяти, вызывающая чрезмерное использование памяти. Затем, чтобы подтвердить, что причиной проблемы является фрагментация, я бы обернул все вызовы malloc
и free
вашей собственной оберткой, которая увеличивает и уменьшает переменную «общего количества выделенных байтов», чтобы вы могли в любой момент сравните теоретическое и фактическое потребление памяти.
Если выясняется, что проблема заключается в фрагментации, первым хорошим шагом будет выяснить, почему вы делаете так много небольших, недолговечных распределений. Если вы можете устранить их и вместо этого распределить всю память, которая потребуется конкретному объекту задачи / данным в одном блоке, то разбейте его на части самостоятельно, вы не только избавитесь от наихудшей фрагментации, но и значительно улучшите производительность своего кода. немного. Каждый вызов malloc
или free
требует значительных накладных расходов, особенно в многопоточной среде, где необходима синхронизация / блокировка. Хранение всех связанных данных в одном выделенном блоке также может уменьшить или исключить необходимость написания специального кода для свободных структур, содержащих указатели; часто бывает достаточно одного вызова free
(хотя для сохранения непрозрачности реализации вы все равно должны обернуть это функцией foo_free
).