2009-12-20 50 views
3

我想了解如何升壓內存映射文件的工作。下面的代碼工作,它做它應該做的事情,但問題是它生成的文件存儲在磁盤上(與可執行文件相同的目錄中),而不是內存。也許有一個標誌設置的地方,但我找不到它...
在此先感謝您的任何信息!升壓內存映射文件的問題:他們去磁盤而不是內存

#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
OS:MacOS X的10.6.2

回答

12

存儲器映射地圖磁盤文件到內存中。磁盤上必須有一個文件才能發生!

編輯:從您的意見,這聽起來像你要使用共享內存 - 見http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

+0

對不起,但帶有MAP_ANONYMOUS標誌的mmap不需要或不創建文件系統對象。 – 2009-12-20 16:41:17

+0

MAP_ANONYMOUS標誌提供了與通過映射/ dev/zero獲得的映射相同的映射。這可以用在一些非常特殊的情況下,但我認爲這不是問題所在。 – 2009-12-20 16:44:18

+0

我不使用mmap,但boost :: iostreams :: mapped_file。這就是我的問題所在。 – Pietro 2009-12-20 17:29:15

2

內存映射文件是專門對造成文件的內容顯示在一個內存區域的程序。它們不是關於創建一個特殊的「內存」文件。 Boost的概念直接來源於Unix中mmap系統調用的可用性以及大多數其他操作系統中的類似工具。它被設計成圍繞這種能力的通用包裝。

如果您要做的是創建由兩個進程共享的內存區域,則內存映射文件可以爲您執行此操作,但代價是具有反映該內存內容的磁盤文件。在Linux中,這仍然是相當有效的,因爲文件內容將被簡單地緩存在內存中,並且與文件內容相對應的程序內存頁將與緩存使用的物理頁完全相同。

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

大多數現代的操作系統使用的是不需要通過流程盤高速緩衝存儲器。沒有真正需要虛擬磁盤。在Linux下,有一個名爲tmpfs的文件系統類型,您可以將它用於不必在引導之間保留的文件系統。它的文件通常在內存中,但是它們可以像其他任何類型的內存一樣被換出。

是的,系統V共享內存存在,它有一個絕對糟糕的設計。我不會觸及具有10英尺極點的sys V interprocess通信原語。

+0

因此,tmpfs根本不接觸硬盤(除非它已滿,或需要明確的「刷新」)? – Pietro 2009-12-20 18:17:17

+0

@Pietro,有點。 tmpfs頁面將像其他任何內存頁面一樣對待。所以當系統處於內存壓力下時,它們會被換出。 – Omnifarious 2009-12-21 13:55:37