Что делать, если я выделяю память с помощью mmap вместо malloc?
Каковы недостатки выделения памяти с помощью mmap
(с MAP_PRIVATE и MAP_ANONYMOUS), чем с использованием malloc
? Для данных в области функций я все равно использовал бы стек стека и, следовательно, не malloc.
Один недостаток, который приходит на ум, заключается в динамических структурах данных, таких как деревья и связанные списки, где вам часто требуется выделять и освобождать небольшие фрагменты данных. Использование mmap
было бы дорого по двум причинам: одному для выделения в степени сложности 4096 байт, а другой - для выполнения системного вызова.
Но в других сценариях, как вы думаете, malloc
лучше, чем mmap
? Во-вторых, я переоцениваю недостаток mmap
для динамических структур данных?
Одно из преимуществ mmap
over malloc
Я могу думать о том, что память сразу возвращается в ОС, когда вы выполняете munmap
, тогда как с malloc/free
, я думаю, память uptil точка прерывания сегмента данных никогда не возвращался, но сохранялся для повторного использования.
Ответы
Ответ 1
Да, malloc
лучше, чем mmap
. Это намного проще в использовании, гораздо более мелкозернистый и гораздо более портативный. В конце концов, он все равно вызовет mmap
.
Если вы начинаете ежедневное управление памятью с помощью mmap
, вы захотите реализовать какой-то способ разделить его на более мелкие куски, чем на страницы, и вы, вероятно, закончите переопределять malloc
- в субоптимальном виде.
Ответ 2
Во-первых, mmap()
- это специфичная для платформы конструкция, поэтому, если вы планируете писать переносимый C, он уже вышел.
Во-вторых, malloc()
по существу реализуется с точки зрения mmap()
, но это своего рода интеллектуальная обертка библиотеки вокруг системного вызова: при необходимости запрашивает новую память из системы, но до тех пор она будет выбирать кусок памяти в области, которая уже привязана к процессу.
Поэтому, если вы хотите сделать обычное распределение динамической памяти, используйте malloc()
, конец истории. Использование mmap()
для распределения памяти должно быть зарезервировано для особых ситуаций (например, если вы действительно хотите создать целую страницу для себя, выровнены на границе страницы) и всегда абстрагироваться в единый фрагмент кода библиотеки, чтобы другие могли легко понять, что вы делаете.
Ответ 3
Одна функция, которая mmap
имеет malloc
, не имеет, mmap
позволяет вам выделять использование огромных страниц (флаг имеет значение MAP_HUGETLB
), а malloc
не имеет этой опции.