Разница между malloc и mmap

#c #malloc #mmap

#c #malloc #mmap

Вопрос:

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

 c = malloc(1000)
  

и этот :

 c = mmap(NULL, 1000, PROT_READ | PROT_WRITE| MAP_ANON, -1, 0);
  

Комментарии:

1. Есть ли у вас какой-либо код, который мог бы объяснить лучше, чем это описание? mmap не для выделения памяти, а для файлов с отображением в память. Я не знаю, почему это применимо здесь. Если вы хотите точно знать, что он делает, это хорошо, но на это легко ответить , прочитав документацию .

2. Если мы использовали флаг MAP_ANON, нам не нужно использовать файл, поэтому mmap возвращает зону памяти, но malloc тоже возвращает зону памяти, в чем разница?

3. Я не уверен, почему это был бы лучший подход по сравнению с простым выполнением необходимых низкоуровневых вызовов ОС, которые malloc выполняются внутри.

4. @tadman mmap используется вместе с потенциально sbrk для реализации malloc , если я не ошибаюсь.

5. @Carcigenicate Это действительно зависит от вашей операционной системы. Windows, как известно, странная, и еще больше странностей в непозиционных.

Ответ №1:

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

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

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

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

Комментарии:

1. Итак, насколько я понимаю: Malloc использует уже известную память, и если этого недостаточно, он использует mmap, чтобы получить больше места, и причина, по которой мы не используем mmap, заключается в том, что mmap всегда запрашивает новое пространство памяти, не проверяя, есть ли в уже отображенной памяти свободное место, я прав?

2. @HakimELmansouri: Многие операционные системы предназначены для работы с блоками, кратными 4 КБ или 64 КБ памяти. Если кто-то хочет использовать функцию выделения операционной системы для создания 500 объектов, каждый из которых имеет длину 64 байта, эти 500 объектов могут занимать 2 048 000 байт памяти. В отличие от этого, в зависимости от того, как malloc() отслеживаются вещи, выделение может занять всего 32 000 байт и, вероятно, займет не более 48 000.