2009-08-06 3 views
1

Хотелось узнать, что, если между максимальным объемом памяти, которое может быть использовано для сопоставления файла с помощью mmap(), и размерами ОЗУ в поле linux , Я попытался использовать карту памяти для некоторых файлов, и обнаружил, что я не могу отображать больше файлов, когда использование «Mapped» приближается к «MemTotal» (просматривается через cat/proc/meminfo).Использование памяти при загрузке файлов через mmap()

С/Proc/MemInfo на 64-битной Linux, коробке:

MemTotal: 32909628 кБ

MemFree: +221744 кБ

Буферы: 1800 Кбайт

Подключенные: 31642928 кБ

CommitLimit: 38012616 kB

Committed_AS: 42641120 Кбайт

VmallocTotal: 536870911 кБ

VmallocUsed: 299920 кБ

VmallocChunk: 536568999 кБ

Итак, я прав, полагая, что "Подключенные" использование никогда не превысит «MemTotal». Смятение, которое у меня есть, я придерживаюсь мнения, что память всегда виртуальна, когда мы mmap файл.

Спасибо!

ответ

1

Нет, если у вас нет memlock() в памяти, вы, скорее всего, попадете в ограниченное адресное пространство для OS. Тот факт, что он аккуратно выходит на 32 ГБ, как и ваша оперативная память, скорее всего, является совпадением.

Edit: На самом деле, если вы используете MAP_PRIVATE, то вы можете быть действительно ударяя пределы памяти (опция MAP_PRIVATE учитывается как частное распределение, и поэтому должна быть физической памяти или подкачки, чтобы покрыть его, если агрессивный overcommit включен). Попробуйте использовать MAP_SHARED, если вы еще этого не сделали.

+0

Добавил в мой вопрос дополнительную информацию. По ограничению адресного пространства для OS, вы имеете в виду ограничение виртуальной памяти. Но в то время у меня, похоже, много виртуальной памяти. – sim

+0

Я имею в виду предел того, сколько адресного пространства может обрабатывать один процесс за один раз. – bdonlan

+0

Я бы подумал, что это будет в 64-битной линейке Linux. Моя программа загружает только 1,5 ГБ файла в память. – sim

0

Вы можете сопоставить большие файлы в кусках, которые вписываются в память (см. Параметры len и off mmap).