mmap е основно програмен достъп до подсистемата на виртуалната памет.
Когато имате, да речем, 1G файл и го направите mmap, получавате указател към "целия" файл, сякаш е в паметта.
На този етап обаче нищо не се е случило освен действителната операция по картографиране на резервиране на страници за файла във VM. (Колкото по-голям е файлът, толкова по-дълга е операцията по картографиране, разбира се.)
За да започнете да четете данни от файла, вие просто осъществявате достъп до него чрез указателя, който ви е върнат в извикването mmap.
Ако искате да "заредите предварително" части от файла, просто посетете областта, която искате да заредите предварително. Уверете се, че посещавате ВСИЧКИ страници, които искате да заредите, тъй като VM ще зареди само страниците, до които имате достъп. Например, да речем във вашия 1G файл, че имате 10MB "индексна" област, която искате да картографирате. Най-простият начин би бил просто да "разходите своя индекс" или каквато и да е структура от данни, която имате, оставяйки VM страницата в данни, ако е необходимо. Или, ако „знаете“, че това са „първите 10MB“ от файла и че размерът на вашата страница за вашата виртуална машина е, да речем, 4K, тогава можете просто да прехвърлите указателя 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'd блока, ще работи (винаги от асемблирането).
Ако не промените нито една от mmapd данните, VM автоматично ще изчисти старите страници, тъй като са необходими нови страници. Ако наистина ги промените, тогава VM ще запише тези страници обратно вместо вас.
person
Will Hartung
schedule
15.04.2009