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