Использование 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;
}

У меня есть несколько вопросов здесь:

  1. Когда я делаю это: mf.open(params), я вижу, что файл создается на диске размером 100. Теперь, когда я пишу в него, т.е. *w = w1, содержимое файла на диске изменяется. Значит ли это, что я вообще не использую ОЗУ и пишу прямо в
    диск?

  2. Когда я делаю mf.size(), он всегда дает мне размер, который я указал в качестве входных данных для создания реального файла. Как я могу узнать размер данных, которые я фактически записал в
    файл в памяти?

  3. Также, если я дам params.new_file_size = 10GB, файл такого размера будет создан на
    диск, но он не занимает места на диске. Подтверждено с помощью df cmd. Почему так? ------ использованием rwx. 1 корень root 10000000000 29 апреля 14:26 map.dat

  4. Я прочитал, что закрытый файл освобождает отображение. Означает ли это, что после закрытия я теряю все данные, которые я написал? Но это не так, поскольку у меня есть рабочий код, в котором я закрываю, а затем снова открываю файл и читаю его правильно.

  5. Как удалить файлы отображения памяти, созданные после использования? Используя 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?

Да.

Другие вопросы по тегам