Нет, вы делаете сопоставление файла с памятью. Это отличается от фактического чтения файла в память.
Если бы вы прочитали его, вам пришлось бы перенести все содержимое в память. Сопоставляя его, вы позволяете операционной системе справиться с этим. Если вы попытаетесь прочитать или записать место в этой области памяти, ОС сначала загрузит соответствующий раздел для вас. Он не загружает весь файл, если только он не нужен.
Вот где вы получаете прирост производительности. Если вы отобразите весь файл, но измените только один байт, а затем удалите его, вы обнаружите, что дискового ввода-вывода совсем немного.
Конечно, если вы коснетесь каждого байта в файле, то да, все это будет загружено в какой-то момент, но не обязательно в физической памяти сразу. Но это так, даже если вы загружаете весь файл заранее. ОС заменит части ваших данных, если не хватит физической памяти для их хранения вместе с другими процессами в системе.
Основные преимущества отображения памяти:
- вы откладываете чтение разделов файла до тех пор, пока они не потребуются (и, если они никогда не понадобятся, они не будут загружены). Таким образом, нет больших первоначальных затрат, поскольку вы загружаете весь файл. Он амортизирует стоимость погрузки.
- Запись автоматизирована, вам не нужно записывать каждый байт. Просто закройте его и ОС запишет измененные разделы. Я думаю, что это также происходит, когда память выгружается (в ситуациях с нехваткой физической памяти), поскольку ваш буфер - это просто окно в файл.
Имейте в виду, что, скорее всего, существует разрыв между использованием вашего адресного пространства и использованием вашей физической памяти. Вы можете выделить адресное пространство 4G (в идеале, хотя могут быть ограничения ОС, BIOS или аппаратных средств) на 32-битной машине с 1G оперативной памяти. ОС обрабатывает подкачку на диск и с диска.
И чтобы ответить на ваш дальнейший запрос на разъяснение:
Просто для ясности. Итак, если мне нужен весь файл, mmap действительно загрузит весь файл?
Да, но это может быть не все сразу в физической памяти. ОС заменит биты обратно в файловую систему, чтобы добавить новые биты.
Но это также произойдет, если вы прочитали весь файл вручную. Разница между этими двумя ситуациями заключается в следующем.
Когда файл считывается в память вручную, ОС заменяет части вашего адресного пространства (могут включать данные или нет) в файл подкачки. И вам нужно будет вручную перезаписать файл, когда вы закончите с ним.
При сопоставлении памяти вы фактически указываете ему использовать исходный файл в качестве дополнительной области подкачки только для этого файла/памяти. И когда данные записываются в эту область подкачки, это немедленно влияет на фактический файл. Таким образом, нет необходимости вручную что-либо переписывать, когда вы закончите, и это не повлияет на обычный обмен (обычно).
Это действительно просто окно в файл:
![образ файла с отображением памяти](https://i.stack.imgur.com/xJYuY.jpg)
person
paxdiablo
schedule
29.12.2009