Проблема с файлами, отображаемыми в памяти: они помещаются на диск, а не в ОЗУ.

Я пытаюсь понять, как работают файлы с отображением памяти Boost. Следующий код работает, он делает то, что должен делать, но проблема в том, что генерируемый им файл хранится на диске (в том же каталоге исполняемого файла), а не в памяти. Может быть где-то есть флаг, который нужно установить, но я его не нашел...
Заранее спасибо за любую информацию!

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <boost/iostreams/device/mapped_file.hpp>
    using std::cout;
    using std::endl;

    int main(int argc, char** argv) {
     const int blockSize = 64;
     bool writer = false;

     if(argc > 1) {
      if(!strcmp(argv[1], "w"))
       writer = true;
     }

     boost::iostreams::mapped_file_params  params;
     params.path = "map.dat";
    // params.length = 1024;     // default: all the file
     params.new_file_size = blockSize;

     if(writer) {
      cout << "Writer" << endl;
      params.mode = std::ios_base::out;
     }
     else {
      cout << "Reader" << endl;
      params.mode = std::ios_base::in;
     }

        boost::iostreams::mapped_file  mf;
        mf.open(params);

     if(writer)
     {
      char *block = mf.data();
      strcpy(block, "Test data block...\0");
      cout << "Written: " << block << endl;
     }
     else
     {
      cout << "Reading: " << mf.const_data() << endl;
     }

     mf.close();

        return 0;
    }
/*
    Compiler options: -Wall -I$(PATH_BOOST_INCLUDE) -ggdb
    Linker options: -L$(PATH_BOOST_LIBS) -lboost_iostreams-mt -lboost_system-mt -lboost_filesystem-mt -DBOOST_FILESYSTEM_NO_DEPRECATED
*/

Используемый компилятор: gcc 4.2.1
Boost 1.41.0
ОС: MacOS X 10.6.2


person Pietro    schedule 20.12.2009    source источник


Ответы (2)


Отображение памяти сопоставляет файлы диска с памятью. Для этого должен быть файл на диске!

Изменить: Судя по вашим комментариям, вы хотите использовать общую память — см. http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

person Community    schedule 20.12.2009
comment
извините, но mmap с флагом MAP_ANONYMOUS не требует и не создает объект файловой системы. - person Pete Kirkham; 20.12.2009
comment
Флаг MAP_ANONYMOUS обеспечивает сопоставление, идентичное полученному при сопоставлении /dev/zero. Это можно использовать в некоторых очень особых обстоятельствах, но я думаю, что вопрос не в этом. - person ; 20.12.2009
comment
Я использую не mmap, а boost::iostreams::mapped_file. С этим связана моя проблема. - person Pietro; 20.12.2009
comment
Также хотелось бы, чтобы файл создавался прямо в памяти, без копии на диске. Допустим, это просто временные данные. - person Pietro; 20.12.2009
comment
Тогда почему бы просто не использовать std::vector ‹char› или аналогичный? - person ; 20.12.2009
comment
Потому что я хочу, чтобы эти данные разделялись между разными приложениями. - person Pietro; 20.12.2009
comment
Спасибо, Нил, мне нужна общая память. Я использую SSD, и я не хочу подчеркивать это, если в этом нет крайней необходимости. - person Pietro; 20.12.2009

Файлы с отображением памяти предназначены специально для того, чтобы содержимое файла отображалось как область памяти в вашей программе. Речь не идет о создании специального файла «в памяти». Концепция Boost взята непосредственно из доступности системного вызова mmap в Unix и аналогичных средств в большинстве других операционных систем. Он разработан как универсальная оболочка вокруг этой возможности.

Если вы пытаетесь создать область памяти, совместно используемую двумя процессами, файлы отображения памяти могут сделать это за вас, но за счет наличия на диске файла, отражающего содержимое этой памяти. В Linux это все еще будет достаточно эффективным, поскольку содержимое файла будет просто кэшироваться в памяти, а страницы памяти вашей программы, соответствующие содержимому файла, будут точно такими же физическими страницами, которые используются кешем.

Если вам нужен только RAM-диск...

Большинство современных операционных систем используют память для дискового кэша, который не нужен процессам. Нет реальной необходимости в ramdisk. В Linux существует тип файловой системы, называемый tmpfs, который вы можете использовать для файловых систем, которые не должны сохраняться между загрузками. Его файлы, как правило, находятся в памяти, но их можно выгрузить, как и любую другую память.

Да, разделяемая память System V существует, и у нее абсолютно ужасный дизайн. Я бы не стал трогать примитивы межпроцессного взаимодействия sys V даже 10-футовым шестом.

person Omnifarious    schedule 20.12.2009
comment
Значит, tmpfs вообще не касается жесткого диска (если только он не заполняется или не требуется явная промывка)? - person Pietro; 20.12.2009
comment
@Пьетро, ​​типа того. Страницы tmpfs будут обрабатываться так же, как и любые другие страницы памяти. Таким образом, они будут заменены, когда система находится под нехваткой памяти. - person Omnifarious; 21.12.2009