mmap — это в основном программный доступ к подсистеме виртуальной памяти.
Когда у вас есть, скажем, файл размером 1 ГБ, и вы выполняете его mmap, вы получаете указатель на «весь» файл, как если бы он находился в памяти.
Однако на этом этапе ничего не произошло, кроме фактической операции сопоставления резервирования страниц для файла в виртуальной машине. (Конечно, чем больше файл, тем дольше операция отображения.)
Чтобы начать чтение данных из файла, вы просто обращаетесь к нему через указатель, который вы вернули при вызове mmap.
Если вы хотите «предварительно загрузить» части файла, просто перейдите в ту область, которую вы хотите предварительно загрузить. Убедитесь, что вы посещаете ВСЕ страницы, которые хотите загрузить, поскольку виртуальная машина будет загружать только те страницы, к которым вы обращаетесь. Например, скажем, в вашем 1G-файле у вас есть «индексная» область размером 10 МБ, которую вы хотите отобразить. Самый простой способ — просто «пройтись по вашему индексу» или любой другой структуре данных, которая у вас есть, позволяя странице VM в данных по мере необходимости. Или, если вы «знаете», что это «первые 10 МБ» файла и что размер вашей страницы для вашей виртуальной машины составляет, скажем, 4 КБ, тогда вы можете просто привести указатель mmap к указателю char и просто перебрать страницы.
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 не имеет к этому никакого отношения, все дело в том, как вы получаете доступ к данным.
Поскольку вы используете базовую систему VM, все, что обращается к данным в блоке mmap, будет работать (когда-либо из сборки).
Если вы не измените какие-либо данные mmap, виртуальная машина автоматически удалит старые страницы по мере необходимости в новых страницах. Если вы действительно измените их, виртуальная машина запишет эти страницы обратно для вас.
person
Will Hartung
schedule
15.04.2009