По аналогии, в системах, которые его поддерживают, mmap()
поставляет память оптом, а malloc()
поставляет ее в розницу. Поскольку в стандарте C указана только последняя функция, код, использующий mmap()
, будет работать только с системами, которые его поддерживают (Unix определяет его, но не поддерживает некоторые другие операционные системы).
Как правило, типичная реализация malloc проверяет, знает ли она какую-либо область памяти, в которой достаточно места для удовлетворения запроса. Если это так, удалите эту область памяти из своего списка фрагментов, запишите ее адрес для возврата вызывающей стороне и, если он значительно больше запрошенного размера, добавьте часть области за пределы того, что было выделено, обратно в его память. список свободных регионов.
Если malloc() обнаружит, что ни одна из известных ей областей свободного хранилища не сможет удовлетворить запрос, она запросит область хранения из базовой среды (вероятно, используя mmap() в системе Unix или другие средства в системе Unix). другие системы), запишите его адрес для возврата вызывающему абоненту и добавьте любую часть региона, выходящую за рамки того, что необходимо немедленно, в список свободных регионов.
Обратите внимание, что функция malloc() предназначена для достаточно эффективной обработки различных сценариев, в том числе таких, в которых приложение многократно выделяет и освобождает множество небольших блоков. Использование mmap()
в таких случаях приведет к плохим результатам, поскольку оно предназначено для обработки нечастых выделений больших блоков. Использование malloc()
будет означать, что если приложение запрашивает много небольших областей, эти запросы могут быть удовлетворены путем разделения нескольких больших областей, полученных от mmap()
, а также означает, что если выделение освобождает память, а позже необходимо получить некоторые, последние запросы могут повторно использовать память. хранилище, которое было только что освобождено, без необходимости повторного использования базовой среды.
person
supercat
schedule
30.10.2020
mmap
предназначен не для выделения памяти, а для отображаемых в память файлов. Я не знаю, почему это применимо здесь. Если вы хотите точно знать, что он делает, это хорошо, но на него легко ответить, прочитав документацию. - person tadman   schedule 31.10.2020malloc
делает внутри. - person tadman   schedule 31.10.2020mmap
используется вместе с потенциальноsbrk
для реализацииmalloc
, если я не ошибаюсь. - person Carcigenicate   schedule 31.10.2020mmap
. - person tadman   schedule 31.10.2020malloc
клон, и у меня было то же впечатление, что и у ОП. Мой первоначальный план состоял в том, чтобы отобразить несколько страниц с помощьюmmap
, а затем найти способ управления памятью на этих страницах (что, по-видимому, и использует OpenBSD). Однако, почитав,sbrk
кажется более распространенным методом, так как явно анонимные вызовыmmap
даже не стандартны: - person Carcigenicate   schedule 31.10.2020MAP_ANONYMOUS
, вы можете получить тот же эффект, сопоставив/dev/zero
. Это просто немного менее эффективно из-за дополнительных системных вызовов. - person Nate Eldredge   schedule 31.10.2020