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