Domanda

Sto cercando di capire come aumentare la memoria mappata file funzionano. Il seguente codice funziona, fa quello che deve fare, ma il problema è che il file che genera è memorizzato su disco (nella stessa directory del file eseguibile) al posto della memoria. Forse c'è un flag per impostare da qualche parte, ma non riuscivo a trovarlo ...
Grazie in anticipo per qualsiasi 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
*/

compilatore utilizzato: gcc 4.2.1
Boost 1.41.0
OS: MacOS X 10.6.2

È stato utile?

Soluzione

mappatura di memoria associa file su disco in memoria. Ci deve essere un file su disco per questo accada!

Modifica Da tuoi commenti, suona come si desidera utilizzare la memoria condivisa - vedere http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

Altri suggerimenti

file mappato in memoria sono specificamente causando il contenuto di un file di presentarsi come una regione della memoria nel vostro programma. Essi non sono sulla creazione di una speciale 'in memoria' file. Il concetto di Boost è presa direttamente dalla disponibilità della chiamata di sistema mmap in Unix e strutture simili nella maggior parte degli altri sistemi operativi. È stato progettato per essere un wrapper generico intorno a questa funzionalità.

Se si sta cercando di fare è creare una regione di memoria condivisa da due processi, la memoria mappata file possono fare per voi, ma a costo di avere un file su disco che riflette il contenuto di quella memoria. In Linux questo sarà ancora ragionevolmente efficiente, in quanto il contenuto del file saranno semplicemente memorizzate nella cache e pagine di memoria del vostro programma corrispondenti al contenuto del file saranno le stesse pagine fisiche esatte come vengono utilizzati dalla cache.

Se quello che vuoi è solo un ramdisk ...

La maggior parte dei sistemi operativi moderni utilizzano la memoria per la cache del disco che non è necessario per i processi. Non v'è alcuna reale necessità di un ramdisk. Sotto Linux v'è un tipo di filesystem chiamato tmpfs che è possibile utilizzare per i file system che non hanno a persistere tra stivali. I suoi file saranno generalmente in memoria, ma possono essere scambiati fuori, proprio come qualsiasi altro tipo di memoria può essere.

Sì, esiste il sistema V memoria condivisa, e ha un design assolutamente abissale. Non vorrei toccare le primitive di comunicazione tra processi sys V con un palo di 10 piedi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top