Преимущества анонимного mmap перед malloc под давлением памяти - PullRequest
5 голосов
/ 25 ноября 2011

Я использую код обработки большого массива (на Pentium под управлением Linux). Размеры массивов достаточно велики для обмена процессами. Пока что это работает, вероятно, потому что я стараюсь, чтобы мои чтения и записи были непрерывными. Тем не менее, мне скоро нужно будет обрабатывать большие массивы. В этом случае поможет ли переключение на анонимные блоки mmapped?

Если да, объясните, пожалуйста, почему.

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

Примечание. Пожалуйста, не предлагайте 64-битную и более оперативную память. К сожалению, это не вариант.

Ответы [ 2 ]

15 голосов
/ 25 ноября 2011

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

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

Вы также можете попытатьсядать ядру несколько советов об использовании памяти с помощью системного вызова madvise().

2 голосов
/ 25 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...