Problème de mémoire boost fichiers mis en correspondance: ils vont sur le disque au lieu de RAM

StackOverflow https://stackoverflow.com/questions/1936266

Question

Je suis en train de comprendre comment fonctionnent les fichiers mappés en mémoire Boost. Le code suivant fonctionne, il fait ce qu'il est censé faire, mais le problème est que le fichier qu'il génère est stocké sur le disque (dans le même répertoire de l'exécutable) au lieu de la mémoire. Peut-être il y a un drapeau pour mettre quelque part, mais je ne pouvais pas trouver ...
Merci d'avance pour toute info!

    #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
*/

compilateur utilisé: gcc 4.2.1
Boost 1.41.0
OS: Mac OS X 10.6.2

Était-ce utile?

La solution

mappage de la mémoire des cartes fichiers de disque en mémoire. Il doit y avoir un fichier sur le disque pour que cela se produise!

Modifier De vos commentaires, il semble que vous voulez utiliser la mémoire partagée - voir http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

Autres conseils

Les fichiers de mémoire mappées sont spécifiquement de causer le contenu d'un fichier pour apparaître comme une région de la mémoire dans votre programme. Ils ne sont pas sur la création d'un fichier spécial « en mémoire ». Le concept de Boost provient directement de la disponibilité de l'appel système mmap sous Unix et des installations similaires dans la plupart des autres systèmes d'exploitation. Il est conçu pour être un emballage générique autour de cette capacité.

Si ce que vous essayez de faire est de créer une région de mémoire partagée par deux processus, la mémoire mappée fichiers peuvent faire pour vous, mais au prix d'avoir un fichier sur disque qui reflète le contenu de cette mémoire. Dans Linux, ce sera encore raisonnablement efficace puisque le contenu du fichier seront simplement mises en cache dans les pages mémoire et de la mémoire de votre programme correspondant au contenu du fichier seront les mêmes pages physiques exactes que celles qui sont utilisées par le cache.

Si ce que vous voulez est juste un disque virtuel ...

La plupart des systèmes d'exploitation modernes utilisent de la mémoire pour le cache disque qui n'est pas nécessaire par des processus. Il n'y a pas de réel besoin pour un disque virtuel. Sous Linux, il est un type de système de fichiers appelé tmpfs que vous pouvez utiliser pour les systèmes de fichiers qui ne doivent pas persister entre des bottes. Ses fichiers seront généralement en mémoire, mais ils peuvent être permutées comme tout autre type de mémoire peut être.

Oui, le système V mémoire partagée existe, et il a un design absolument abyssal. Je ne toucherais pas les primitives de communication interprocess sys V avec un pôle de 10 pieds.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top