增强内存映射文件的问题:它们转到磁盘而不是RAM

时间:2009-12-20 16:29:14

标签: c++ boost memory-mapped-files ramdisk

我试图了解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
*/

使用的编译器:gcc 4.2.1
提升1.41.0
操作系统:MacOS X 10.6.2

2 个答案:

答案 0 :(得分:12)

内存映射将磁盘文件映射到内存中。磁盘上必须有一个文件才能实现!

修改:根据您的评论,您似乎想要使用共享内存 - 请参阅http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

答案 1 :(得分:2)

内存映射文件专门用于使文件内容显示为程序中的内存区域。它们不是要创建一个特殊的“内存”文件。 Boost的概念直接取决于Unix中mmap系统调用的可用性以及大多数其他操作系统中的类似工具。它被设计为围绕此功能的通用包装器。

如果您要创建的是创建由两个进程共享的内存区域,则内存映射文件可以为您执行此操作,但代价是具有反映该内存内容的磁盘上文件。在Linux中,这仍然是合理有效的,因为文件内容将简单地缓存在内存中,并且与文件内容相对应的程序的内存页面将与缓存使用的物理页面完全相同。

如果你想要的只是一个ramdisk ......

大多数现代操作系统都使用内存来处理进程不需要的磁盘缓存。没有真正需要ramdisk。在Linux下,有一个名为tmpfs的文件系统类型,您可以将其用于不必在引导之间保留的文件系统。它的文件通常都在内存中,但它们可以像任何其他类型的内存一样被换出。

是的,存在系统V共享内存,并且它具有绝对糟糕的设计。我不会用10英尺的极点触摸sys V进程间通信原语。