mmap - это в основном программный доступ к подсистеме виртуальной памяти.
Когда у вас есть, скажем, файл 1G, и вы отображаете его, вы получаете указатель на «весь» файл, как если бы он был в памяти.
Однако на этом этапе ничего не произошло, за исключением фактической операции отображения резервирования страниц для файла в ВМ. (Чем больше файл, тем дольше операция сопоставления, конечно.)
Чтобы начать чтение данных из файла, вы просто получаете к нему доступ через указатель, который был возвращен в вызове mmap.
Если вы хотите «предварительно загрузить» части файла, просто зайдите в область, которую вы хотите предварительно загрузить. Убедитесь, что вы посещаете ВСЕ страницы, которые хотите загрузить, поскольку ВМ будет загружать только те страницы, к которым вы обращаетесь. Например, скажем, в вашем 1G-файле у вас есть 10-мегабайтная «индексная» область, которую вы хотите отобразить. Самый простой способ - просто «пройтись по индексу» или любой другой структуре данных, которая у вас есть, позволить странице VM в данных по мере необходимости. Или, если вы «знаете», что это «первые 10 МБ» файла и что размер вашей страницы для вашей виртуальной машины составляет, скажем, 4 КБ, то вы можете просто привести указатель mmap к указателю на символ и просто выполнить итерацию по стр.
void load_mmap(char *mmapPtr) {
// We'll load 10MB of data from mmap
int offset = 0;
for(int offset = 0; offset < 10 * 1024 * 1024; offset += 4 * 1024) {
char *p = mmapPtr + offset;
// deref pointer to force mmap load
char c = *p;
}
}
Что касается кэшей L1 и L2, mmap не имеет к этому никакого отношения, это все о том, как вы получаете доступ к данным.
Поскольку вы используете базовую систему виртуальных машин, все, что обращается к данным в блоке mmap, будет работать (даже с момента сборки).
Если вы не измените какие-либо данные mmap, виртуальная машина автоматически удалит старые страницы, когда понадобятся новые страницы. Если вы действительно измените их, виртуальная машина запишет эти страницы обратно для вас.