Как работает mmap? - PullRequest
       36

Как работает mmap?

7 голосов
/ 04 мая 2011

Я работаю над программами в Linux, которым нужен файл mmap с жесткого диска, но у меня есть вопрос, что может привести к сбою. Например, если все воспоминания фрагментированы, каждый из которых содержит только 200 МБ, но я хочу отобразить файл в память размером 1000 МБ, это удастся?

И еще один вопрос, есть ли в linux инструменты для воспоминания, как некоторые инструменты в Windows, например, встроенный инструмент для XP.

Спасибо.

Ответы [ 3 ]

15 голосов
/ 04 мая 2011

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

Если у вас много сопоставленных файлов, вы можете столкнуться с проблемами фрагментации в 32-разрядной системе, где адресное пространство относительно ограничено.В 64-разрядной системе фрагментация вряд ли будет проблемой, поскольку даже если у вас есть только небольшие области, доступные между существующими сопоставлениями, все еще имеется много-много доступного смежного адресного пространства рядом с существующими сопоставлениями.

Более распространенная проблема в 32-разрядной системе состоит в том, что адресное пространство слишком мало, чтобы отображать большие файлы вообще.Из 4 ГБ адресного пространства обычно 2 ГБ доступно для пользовательского пространства, а остальные 2 ГБ зарезервированы ядром.Из этих 2 ГБ ваши сопоставления должны совместно использовать пространство с кодом и стеками программы (обычно небольшими) и кучей (потенциально большими). ​​

Короче говоря, mmap() часто может давать сбой в 32-разрядных системах, еслифайл слишком велик, но вряд ли у вас когда-нибудь будет файл, достаточно большой, чтобы вызвать эту проблему в 64-разрядной системе.

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

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

Непонятно, что вы имеете в виду, вспоминаяобъем памяти.Помните, что ограниченный ресурс, который потребляет mmap(), - это не память, это адресное пространство .Потенциально вы можете отобразить файл 1 ГБ, даже если на самом деле машина имеет только 128 МБ ОЗУ, но в 32-разрядной системе вы не можете отобразить файл 4 ГБ, даже если у компьютера есть 16 ГБ ОЗУ.

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

3 голосов
/ 04 мая 2011

mmap работает, манипулируя таблицей страниц вашего процесса, структурой данных, которую ваш ЦП использует для сопоставления адресных пространств.ЦП преобразует "виртуальные" адреса в "физические" и делает это в соответствии с таблицей страниц , установленной вашим ядром.

Когда вы получаете доступ кПри отображении памяти в первый раз, ваш процессор генерирует ошибку страницы .Затем ядро ​​ОС может подключиться, «исправить» неправильный доступ к памяти, выделив память и выполнив файловый ввод-вывод в этом вновь выделенном буфере, а затем продолжить выполнение вашей программы, как будто ничего не произошло.

mmapможет потерпеть неудачу, если ваш процесс находится вне адресного пространства, что-то, на что стоит обратить внимание в наши дни для 32-битного кода, где все используемые адреса могут быть сопоставлены довольно быстро с большими наборами данных.Также может произойти сбой любой из вещей, упомянутых в разделе «Ошибки» справочной страницы .

Доступ к памяти внутри отображаемой области также может произойти сбой, если у ядра есть проблемы с выделением памяти или выполнениемI / O.В этом случае ваш процесс получит сигнал SIGBUS .

0 голосов
/ 04 мая 2011

Краткий ответ: это зависит.

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

...