Pregunta

Estoy tratando de entender cómo mejorar la memoria asignada trabajan archivos. El siguiente código funciona, se hace lo que se supone que debe hacer, pero el problema es que el archivo se genera se almacena en disco (en el mismo directorio del ejecutable) en lugar de la memoria. Tal vez hay un pabellón que establezcan alguna parte, pero no pudo encontrarlo ...
Gracias de antemano por cualquier información!

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

compilador utilizado: gcc 4.2.1
Impulsar 1.41.0
OS: MacOS X 10.6.2

¿Fue útil?

Solución

Asignación de memoria de mapas de archivos de disco en la memoria. Tiene que haber un archivo en el disco para que esto suceda!

Editar Desde sus comentarios, parece que desea utilizar memoria compartida - vea http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

Otros consejos

Los archivos de memoria asignada se refieran específicamente a causa del contenido de un archivo a aparecer como una región de memoria del programa. Ellos no son acerca de la creación de un especial 'en memoria' archivo. El concepto de impulso se toma directamente de la disponibilidad de la llamada al sistema mmap en Unix e instalaciones similares en la mayoría de los otros sistemas operativos. Está diseñado para ser un contenedor genérico en torno a esta capacidad.

Si lo que está tratando de hacer es crear una región de memoria compartida por dos procesos, archivos de memoria asignada pueden hacer eso por usted, pero a costa de tener un archivo en el disco que refleja el contenido de dicha memoria. En Linux esto seguirá siendo razonablemente eficiente desde el contenido del archivo simplemente se almacenan en caché en la memoria y en las páginas de memoria del programa correspondientes a los contenidos de los archivos serán las mismas páginas físicas exactas que están siendo utilizados por la caché.

Si lo que quieres es simplemente un disco RAM ...

La mayoría de los sistemas operativos modernos utilizan la memoria de caché de disco que no es necesario por procesos. No hay ninguna necesidad real de un disco RAM. En Linux hay una llamada tmpfs tipo de sistema de archivos que se puede utilizar para sistemas de ficheros que no tienen que persistan entre las botas. Sus archivos estarán generalmente en la memoria, pero pueden ser cambiados al igual que cualquier otro tipo de memoria puede ser.

Sí, existe sistema de memoria compartida V, y tiene un diseño absolutamente abismal. No tocaría las primitivas de comunicación entre procesos sys V con un poste de 10 pies.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top