Linux внутренности MMAP

Вы не можете запретить своим посетителям загружать, копировать или ломать все, что вы выводите в свои браузеры. Если они могут просматривать его, они всегда могут снимать снимок. Что приносит оптимальное решение вашей проблемы: просто предлагайте копии изображений ваших документов вместо реальных PDF-файлов. Вы можете конвертировать / массово конвертировать PDF-файлы в JPEG легко с помощью Photoshop.

23
задан 15 April 2009 в 15:20
поделиться

3 ответа

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, виртуальная машина автоматически удалит старые страницы, когда понадобятся новые страницы. Если вы действительно измените их, виртуальная машина запишет эти страницы обратно для вас.

29
ответ дан Will Hartung 29 November 2019 в 02:25
поделиться

Отвечая на вопрос г-на Рави Фулсундара:

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

mmap

MAP_SHARED

Поделитесь этим отображением со всеми другими процессами, которые отображают этот объект. Хранение в регионе эквивалентно записи в файл. Файл может не обновляться до тех пор, пока не будут вызваны msync (2) или munmap (2).

2
ответ дан Robert S. Barnes 29 November 2019 в 02:25
поделиться

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

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

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

3
ответ дан 29 November 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: