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

Malloc vs mmap в C

Я построил две программы, используя malloc и другие, используя mmap. Время выполнения с использованием mmap намного меньше, чем при использовании malloc.

Я знаю, например, что, когда вы используете mmap, вы избегаете чтения/записи вызовов в систему. И доступ к памяти меньше.

Но есть ли другие причины для преимуществ при использовании mmap над malloc?

Спасибо большое

4b9b3361

Ответ 1

Я предполагаю, что вы ссылаетесь на использование mmap и malloc для чтения данных из файлов. В этом случае вы в значительной степени получили главное:

  • Используя fread/fwrite, вы должны сделать много вызовов в ОС.
  • Используя mmap, вы получаете доступ ко всему файлу за одну операцию. Это не совсем так, потому что ОС, вероятно, одновременно отображает файл страницу памяти, но все еще намного быстрее.

Ответ 2

Оба malloc и mmap медленны в разы. Это зависит в основном от шаблона использования:

ММАП: Подсистема подкачки ядра работает в единицах размера страницы. Это означает, что если вы хотите прочитать целую страницу из файла и хотите многократно сделать это (хорошая локализация), это будет хорошо с mmap. Напротив, если вы сопоставляете этот файл с 5 Гб и получаете разбросанный доступ, у вас будут сводные страницы ядра и многое другое. Помимо фактического ввода-вывода, управление страницей займет некоторое время. Если у вас есть проблемы с задержкой, избегайте этого шаблона доступа, так как механизм репликации страницы Linux имеет тенденцию быть массивным и вызывает заметные задержки, а отравление кеша замедлит другие процессы.

таНос: Это нормально, когда вам нужна память, а не в единицах размера страницы. но вы не можете делать такие вещи, как mlock(). Что касается ввода-вывода, скорость очень зависит от того, как вы это делаете. fread/fwrite может отображать страницы за кулисами или делать буферизацию в пользовательском пространстве. Локализованный доступ будет довольно быстрым. чтение/запись идут напрямую через ядро, поэтому небольшие распределенные виды доступа все равно будут вызывать операции ввода-вывода из-за промахов в кеше, но фактические данные, переданные из kernel- > userspace, будут немного меньше. Я не знаю, насколько это измеримо.

Если mlock() 'ed, пользовательские страницы могут быть выгружены/записаны обратно в любое время. Это требует времени. Таким образом, на системах с небольшой памятью победит вариант, который отображает наименьшую память. С ядром Linux в каждой системе слишком мало памяти, поскольку неиспользуемые страницы используются для кэширования ввода-вывода, и ядро ​​может занять заметное время, чтобы сделать их доступными, если использование памяти или ввод-вывод являются взрывоопасными.

Ответ 3

mmap фактически не загружает файл в память, поэтому он будет загружаться быстрее, но его редактирование будет медленнее.

Другое дело, что mmap не использует память, но занимает адресное пространство. На 64-битной машине большая часть адресного пространства памяти не будет иметь памяти, поэтому вы можете загружать огромные файлы, скажем, 5gb, что вы не хотите malloc.

Ответ 4

Посмотрите на людей, вопреки общему мнению, mmap действительно является функцией распределения памяти, подобной malloc..

файл mmaped является одним из его использования. Вы можете использовать его в качестве функции выделения памяти, передавая -1 в качестве дескриптора файла.

так что... обычно используется malloc для маленьких объектов и mmap для больших.

это хорошая стратегия.

Я использую alloca() для переменных только для объектов.

Ответ 5

mmap фактически не читает файл. Он просто отображает его в адресное пространство. Именно поэтому так быстро, нет ввода/вывода диска, пока вы не получите доступ к этой области адресного пространства.

malloc - это просто отображение адресного пространства в память

Ответ 6

В mmap RAM не предоставляется. Адресное пространство предоставляется.

При обращении к адресному пространству происходит ошибка страницы. Во время ошибки страницы в размере страницы, как правило, 4096 байтов, RAM предоставляется.

Также предоставляется содержимое ОЗУ. Если в файле поддерживается адресное пространство то появится содержимое файла. Если по MAP_ANONYMOUS поддерживается адресное пространство то появляется нулевое инициализированное ОЗУ.

В приведенном выше описании описаны два состояния. Во-первых, точно так же, как и желаемое ОЗУ, можно инициализировать. Во-вторых, до тех пор, пока не будет предоставлена ​​требуемая оперативная память.

При запросе адреса менее 2 мегабайт по malloc разрывается программа. Пока предоставляются адреса, близкие к разрыву программы разрыв программы не может быть сокращен. Поэтому для ядра освобожденное ОЗУ не может быть возвращено. Отсюда следует аналогия. Можно ли снять носки перед обувью?

При вызове munmap в RAM ядра немедленно возвращается. По методу mmap и munmap уменьшается вероятность обмена. По развороту программы malloc разворот разворачивается.

Посредством malloc может быть выделена память размера страницы. Прерывистая память становится. Память ядра также может фрагментироваться. Ничто не идеально.

На любом холостом процессоре RAM ядра можно дефрагментировать. Создаются прозрачные огромные страницы размером в 2 мегабайта. По сравнению с 512 страничными ошибками для обеспечения 2M Когда при помощи одной страницы может быть обеспечена 2M Значительный уровень производительности становится.

В mmap существует по крайней мере одна заметная бана. Для поддержки mmap может использоваться дескриптор файла трубы. Ошибка не возникает. Однако в адресе памяти данные, предоставленные трубой, не отображаются.

Однако, если используется MAP_ANONYMOUS затем из дескриптора файла pipe в предоставленный адрес mmap данные могут быть прочитаны. Хотя это не так эффективно, желаемый результат становится. По lseek неудачный возврат и errno можно идентифицировать файловый дескриптор, подключенный к каналу.

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

В операционной системе, управляемой ядрами вместо mmap зачем использовать malloc? По сравнению с malloc; mmap кажется сложным? Чтобы вызвать munmap ранее запрошенное количество адресного пространства также должны быть предоставлены. Использование malloc более переносимо? malloc кажется более удобным?

Однако, если требуется производительность, используется mmap.

Наконец, но не менее важно, если MAP_SHARED то с процессами потомства данные могут быть разделены. Избегание pthreads имеет первостепенное значение. Иногда клон также можно избежать.

Хотя субъективный, перечисленные методы распределения в наиболее предпочтительном случае: Регистр/стек; ММАП; Глобальный; таНос. Под каждым разным ударом и банами становятся. С помощью достаточно сложной программы; три или, возможно, все четыре метода.