Подтвердить что ты не робот

Что делать, если я выделяю память с помощью mmap вместо malloc?

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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