Что если я выделю память, используя mmap вместо malloc? - PullRequest
21 голосов
/ 15 января 2012

Каковы недостатки выделения памяти с использованием mmap (с MAP_PRIVATE и MAP_ANONYMOUS) по сравнению с использованием malloc? Для данных в области функций я бы все равно использовал стековую память и поэтому не malloc.

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

Но как вы думаете, в других случаях malloc лучше, чем mmap? Во-вторых, переоцениваю ли я недостаток mmap для динамических структур данных?

Одно преимущество mmap перед malloc Я могу думать о том, что память немедленно возвращается ОС, когда вы делаете munmap, тогда как с malloc/free, я думаю, память до точки останова сегмента данных не вернулся, но сохранил для повторного использования.

Ответы [ 3 ]

27 голосов
/ 15 января 2012

Да, malloc лучше, чем mmap.Это гораздо проще в использовании, гораздо более мелкозернистый и гораздо более портативный.В конце концов, он все равно вызовет mmap.

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

19 голосов
/ 15 января 2012

Во-первых, mmap() является платформо-зависимой конструкцией, поэтому, если вы планируете писать переносимый C, она уже вышла.

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

Поэтому, если вы хотите сделать обычное динамическое распределение памяти, используйте malloc(), конец истории. Использование mmap() для выделения памяти должно быть зарезервировано для особых ситуаций (например, если вы на самом деле хотите, чтобы вся страница была для себя, выровнена по границе страницы), и всегда абстрагировано в один фрагмент библиотечного кода, чтобы другие могли легко понять, что ты делаешь.

3 голосов
/ 14 ноября 2014

Одна особенность, которая mmap имеет то, чего нет malloc, это mmap, позволяющая выделять с помощью огромных страниц (для аргумента флага установлено MAP_HUGETLB), тогда как malloc не имеет этой опции.

...