Проблема с увеличенной памятью отображаемых файлов: они идут на диск вместо ОЗУ - PullRequest
3 голосов
/ 20 декабря 2009

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

    #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

Ответы [ 2 ]

12 голосов
/ 20 декабря 2009

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

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

2 голосов
/ 20 декабря 2009

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

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

Если то, что вы хотите, это просто виртуальный диск ...

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...