Виртуальная память: всегда ли операционная система загружает весь файл в физическую память? - PullRequest
0 голосов
/ 11 апреля 2020

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

Насколько я понимаю, операционная система может не выделять всю соответствующую физическую память. Вместо этого он может подождать, пока не произойдет сбой страницы, поскольку моя программа считывает определенную c часть файла (часть, еще не сопоставленную с физической памятью).

Это в основном поведение файла с отображенной памятью. Итак, если мои предположения верны, какая польза от использования системных вызовов, таких как mmap()? Просто чтобы избежать обычного танца для -l oop при чтении с fread(), может быть?

1 Ответ

0 голосов
/ 12 апреля 2020

read (), fread () прочитает указанное вами количество в указанный вами буфер. Mmap - это отдельный интерфейс к кешу файлов ядра. Если эти две точки пересекаются, ядро, скорее всего, сначала прочитает файл в буферы кэша, а затем скопирует выбранные биты этих буферов буфера в пользовательский буфер.

Эта двойная копия часто необходима, поскольку ваша программа не обеспечить необходимый размер выравнивания и блокировки, который требуется базовому устройству, а если данные требуют преобразования (расшифровать, распаковать), ему необходимо место для этого.

Этот кэш ядра сохраняется согласованным с файлом, поэтому система в целом читает и пишет go через него. Если вы отобразите файл, вы сможете избежать двойной копии; но приходится иметь дело с изменениями в файле, появляющемся необъявленным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...