Что ж. Я в значительной степени запутался с концепцией memory mapped file
используется в virtual address spaces
,
По следующей ссылке я гуглил.
http://en.wikipedia.org/wiki/Virtual_address_space
Я нашел раздел
Then the application's executable file is mapped into the Virtual Address Space.
Addresses in the process VAS are mapped to bytes in the exe file.
The OS manages the mapping:
0 4GB
VAS |---vvvvvvv------------------------------------|
mapping |-----|
file bytes app.exe
The v's are values from bytes in the mapped file.
Теперь, что этот файл отображения памяти имеет отношение к конкретному процессу в определенном виртуальном адресном пространстве (запутался в последнем утверждении вышеупомянутого раздела)?
Почему существует явная необходимость включить код для создания файла отображения памяти, соответствующего определенному процессу?
Первое, что вам нужно понять, это разница между физическим адресом и виртуальным адресом. Когда ваша программа записывает данные на определенный (виртуальный) адрес памяти, адрес вашей записи преобразуется в фактический адрес на чипе ОЗУ. Если физический адрес не запрограммирован для определенного виртуального адреса, вы, как правило, получите нарушение доступа или ошибку сегментации.
Это работает, когда модуль управления памятью (MMU) генерирует исключение ЦП, которое вызывает переход к обработчику ошибок ядра. В случае нарушения прав доступа ваш процесс прекращается.
Ядро может делать другие умные вещи. Если ваш процесс простаивает, он может скопировать часть физической памяти, используемой вашим процессом, в файл подкачки (и удалить записи из MMU), когда вы обращаетесь к указанным адресам, исключение ЦП не будет прерывать вашу программу. Вместо этого ядро сначала приостановит ваш процесс. Затем он скопирует данные из файла подкачки обратно в память и перепрограммирует MMU. Затем ядро возобновит ваш процесс, и процесс получит доступ к памяти, как если бы он всегда был там. Что касается процесса, то ничего особенного не произошло. Этот процесс известен как Пейджинг по требованию.
Когда ты mmap
файл, ядро эффективно выполняет подкачку по требованию, но из указанного вами файла, а не из файла подкачки. Процесс точно такой же. Исключение доступа к ЦП приведет к тому, что данные из файла будут считаны в ОЗУ, к которому вы обращаетесь как к обычной памяти. Когда вы закрываете файл, память записывается обратно в освобожденный файл. Большим преимуществом является то, что вы можете использовать данные в файле с указателями.
Надеюсь это поможет
Других решений пока нет …