【问题标题】:Problem with boost memory mapped files: they go to disk instead of RAM提升内存映射文件的问题:它们进入磁盘而不是 RAM
【发布时间】:2010-12-28 12:29:24
【问题描述】:

我正在尝试了解 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

【问题讨论】:

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


    【解决方案1】:

    内存映射将磁盘文件映射到内存中。要发生这种情况,磁盘上必须有一个文件!

    编辑:从您的 cmets 看来,您想使用共享内存 - 请参阅 http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

    【讨论】:

    • 抱歉,带有 MAP_ANONYMOUS 标志的 mmap 不需要或创建文件系统对象。
    • MAP_ANONYMOUS 标志提供的映射与通过映射 /dev/zero 获得的映射相同。这可以在一些非常特殊的情况下使用,但我认为这不是问题所在。
    • 我没有使用 mmap,而是 boost::iostreams::mapped_file。这就是我的问题所在。
    • 那为什么不简单地使用 std::vector 或类似的?
    • 因为我希望这些数据在不同的应用程序之间共享。
    【解决方案2】:

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

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

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

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

    是的,系统 V 共享内存存在,而且它的设计绝对糟糕。我不会用 10 英尺长的柱子碰 sys V 进程间通信原语。

    【讨论】:

    • 所以 tmpfs 根本不接触硬盘(除非它已满,或者需要明确的“刷新”)?
    • @Pietro,有点像。 tmpfs 页面将被视为任何其他内存页面。因此,当系统处于内存压力下时,它们将被换出。
    猜你喜欢
    • 2011-10-26
    • 2015-10-23
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    相关资源
    最近更新 更多