Использование boost::iostreams::mapped_file
Я очень плохо знаком с отображением памяти и пытаюсь понять файлы отображения памяти, чтобы использовать их в моем проекте (на основе Linux). Мое требование состоит в том, чтобы писать и затем читать из отображенных файлов памяти. Я написал пример программы, которая только пишет, и она отлично работает, но у меня есть несколько очень простых сомнений, так как я не понимаю этот фундамент карт памяти должным образом.
#include <unordered_map>
#include <boost/iostreams/device/mapped_file.hpp>
using namespace boost::interprocess;
using namespace std;
typedef unordered_map<int, string> work;
int main()
{
boost::iostreams::mapped_file_params params;
params.path = "map.dat";
params.new_file_size = 100;
params.mode = (std::ios_base::out | std::ios_base::in);
boost::iostreams::mapped_file mf;
mf.open(params);
work w1;
w1[0] = "abcd";
w1[1] = "bcde";
w1[2] = "cdef";
work* w = static_cast<work*>((void*)mf.data());
*w = w1;
mf.close();
return 0;
}
У меня есть несколько вопросов здесь:
Когда я делаю это: mf.open(params), я вижу, что файл создается на диске размером 100. Теперь, когда я пишу в него, т.е. *w = w1, содержимое файла на диске изменяется. Значит ли это, что я вообще не использую ОЗУ и пишу прямо в
диск?Когда я делаю mf.size(), он всегда дает мне размер, который я указал в качестве входных данных для создания реального файла. Как я могу узнать размер данных, которые я фактически записал в
файл в памяти?Также, если я дам params.new_file_size = 10GB, файл такого размера будет создан на
диск, но он не занимает места на диске. Подтверждено с помощью df cmd. Почему так? ------ использованием rwx. 1 корень root 10000000000 29 апреля 14:26 map.datЯ прочитал, что закрытый файл освобождает отображение. Означает ли это, что после закрытия я теряю все данные, которые я написал? Но это не так, поскольку у меня есть рабочий код, в котором я закрываю, а затем снова открываю файл и читаю его правильно.
Как удалить файлы отображения памяти, созданные после использования? Используя rm -rf cmd/linux apis?
1 ответ
- Когда я делаю это: mf.open(params), я вижу, что файл создается на диске размером 100. Теперь, когда я пишу в него, т.е. *w = w1, содержимое файла на диске изменяется. Значит ли это, что я вообще не использую ОЗУ и пишу прямо на диск?
Вы используете файлы с отображением в памяти. Это означает и то, и другое: вы пишете на "страницы виртуальной памяти", которые были сопоставлены с пространством вашего процесса, но фактически ссылаются на блоки диска. Рост указывает на то, что страницы фиксируются при записи.
- Когда я делаю mf.size(), он всегда дает мне размер, который я указал в качестве входных данных для создания реального файла. Как я могу узнать размер данных, которые я фактически записал в отображенный файл памяти?
Ты не можешь Вы можете найти только количество блоков, зафиксированных с помощью такого инструмента, как stat
- Также, если я укажу params.new_file_size = 10 ГБ, файл этого размера будет создан на диске, но он не займет места на диске. Подтверждено с помощью df cmd. Почему так? ------ использованием rwx. 1 корень root 10000000000 29 апреля 14:26 map.dat
Это редко выделяется. Например, используя fallocate
или аналогичные на других платформах.
- Я прочитал, что закрытый файл освобождает отображение. Означает ли это, что после закрытия я теряю все данные, которые я написал? Но это не так, поскольку у меня есть рабочий код, в котором я закрываю, а затем снова открываю файл и читаю его правильно.
Нет. Это означает, что отображение освобождено. То есть область /virtual memory/ область вашего пространства процессов теперь "свободна" для других целей.
- Как удалить файлы отображения памяти, созданные после использования? Используя rm -rf cmd/linux apis?
Да.