Проблема с файлами, отображенными в памяти boost:они отправляются на диск вместо оперативной памяти
-
20-09-2019 - |
Вопрос
Я пытаюсь понять, как работают файлы, отображенные в памяти 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
*/
Используемый компилятор:ссагпз 4.2.1
Повышение 1.41.0
Операционная СИСТЕМА:macOS X 10.6.2
Решение
Отображение памяти отображает дисковые файлы в память.Чтобы это произошло, на диске должен быть файл!
Редактировать: Судя по вашим комментариям, похоже, что вы хотите использовать общую память - см. http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html
Другие советы
Файлы с отображением памяти предназначены специально для отображения содержимого файла в виде области памяти в вашей программе.Речь идет не о создании специального файла "в памяти".Концепция Boost основана непосредственно на доступности mmap
системный вызов в Unix и аналогичные средства в большинстве других операционных систем.Он разработан как универсальная оболочка вокруг этой возможности.
Если то, что вы пытаетесь сделать, это создать область памяти, совместно используемую двумя процессами, файлы с отображением памяти могут сделать это за вас, но ценой наличия файла на диске, который отражает содержимое этой памяти.В Linux это все равно будет достаточно эффективно, поскольку содержимое файла будет просто кэшироваться в памяти, а страницы памяти вашей программы, соответствующие содержимому файла, будут точно такими же физическими страницами, которые используются кэшем.
Если то, что вам нужно, - это просто ramdisk...
Большинство современных операционных систем используют память для дискового кэша, который не нужен процессам.Реальной необходимости в ramdisk нет.В Linux существует тип файловой системы, называемый tmpfs
который вы можете использовать для файловых систем, которым не обязательно сохраняться между загрузками.Его файлы, как правило, будут находиться в памяти, но их можно заменить точно так же, как и любой другой вид памяти.
Да, разделяемая память system V существует, и она имеет абсолютно ужасный дизайн.Я бы не стал прикасаться к примитивам межпроцессных коммуникаций sys V 10-футовым шестом.