2013-02-13 2 views
2

У меня есть программа, которая обычно использует массивные массивы, где память выделяется с помощью mmapнакладных резервирования адресного пространства с помощью ММАП

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

Очевидно, что ответ будет зависимым от платформы, им больше всего интересны x64 linux, sparc solaris и sparc linux. Я думаю, что доступность 1-мегабайтных страниц делает накладные расходы скорее меньше, чем x64.

+0

Я бы не стал беспокоиться о накладных расходах вообще. Это звучит как [преждевременная оптимизация] (http://programmers.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-evil). – Celada

ответ

2

Накладные расходы mmap зависят от того, как вы его используете. И это обычно незначительно, когда вы используете его соответствующим образом.

В Linux ядре mmap операция может быть разделена на две части:

  1. ищет свободный диапазон адресов, который может содержать отображение

  2. Создать/увеличить VMA структуры в адресном пространстве (mm_struct)

Так выделяют большое количество используемой памяти mmap не вводить более накладные расходы, чем небольшие.

Таким образом, вы должны распределять память как можно больше в каждый момент времени. (избегать кратковременных малейших mmap)

И вы можете указать начальный адрес явно (если это возможно). Это может сэкономить некоторое время в ядре при поиске достаточно большого свободного места.

Если ваше приложение является многопоточной программой. Вам следует избегать одновременных вызовов mmap. Это связано с тем, что адресное пространство защищено блокировкой чтения-записи, и mmap всегда берет блокировку записи. mmap Задержка в этом случае будет на порядок больше.

Кроме того, mmap создает только сопоставление, но не таблицу страниц. При попадании страниц в обработчик ошибок страницы выделяются страницы. Обработчик ошибок страницы будет использовать блокировку считывателя, которая защищает адресное пространство, а также может влиять на производительность mmap.

В этом случае вы всегда должны повторить использование большого массива вместо munmap и mmap. (Избегайте страниц)

Смежные вопросы