Когда вы используете mmap для файла, Linux создает записи в MMU (блок управления памятью). MMU отслеживает все операции чтения и записи ЦП в реальную оперативную память. Таким образом, он знает, когда вы обращаетесь к частям памяти, которые вернули mmap()
. Чтение частей, которых еще нет в реальной оперативной памяти, приведет к ошибкам страниц. MMU поймает их и вызовет процедуру ядра для загрузки правой части файла в ОЗУ, а затем обновит запись в таблице MMU, так что теперь кажется, что данные теперь находятся по адресу, который вам дал mmap()
. Фактически, это будет где-то еще, но MMU сделает это полностью прозрачным.
При записи в память MMU помечает измененные страницы как «грязные». Когда они удаляются (из-за того, что вы получаете доступ к большей части файла или вызываете munmap()
), то изменения будут записаны на диск.
Таким образом, каждый раз, когда происходит сбой страницы и сбрасывается грязная страница, происходит системный вызов. Но поскольку страницы имеют размер 4 или 8 КБ, такое случается редко. Кроме того, ядро будет загружать более одной страницы за раз, поэтому количество системных вызовов снова уменьшается. Наконец, тот же код используется для реализации свопинга, поэтому он очень оптимизирован.
Все эти эффекты делают mmap настолько эффективным.
person
Aaron Digulla
schedule
18.11.2009