2009-12-20 3 views
3

어떻게 부스트 메모리 매핑 파일이 작동하는지 이해하려고합니다. 다음 코드는 작동하지만 수행 할 작업을 수행하지만 문제는 생성되는 파일이 메모리 대신 실행 파일의 같은 디렉터리에 디스크에 저장된다는 것입니다. 아마 어딘가에 설정할 수있는 깃발이 있지만, 나는 그것을 찾을 수 없습니다 ...
미리 정보를 주셔서 감사합니다!메모리가 매핑 된 파일을 부스트하는 문제 : RAM 대신 디스크로 이동합니다.

#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 : 메모리에 맥 OS X 10.6.2

답변

12

메모리 매핑지도 디스크 파일. 이 일이 일어나려면 디스크에 파일이 있어야합니다!

편집 : 귀하의 의견에서, 당신이 공유 메모리를 사용하려면 같은 소리 - http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

+0

미안하지만 MAP_ANONYMOUS 플래그가있는 mmap은 파일 시스템 객체를 필요로하지 않습니다. –

+0

MAP_ANONYMOUS 플래그는/dev/zero를 매핑하여 얻은 것과 동일한 매핑을 제공합니다. 이것은 매우 특별한 몇 가지 상황에서 사용될 수 있지만 그 질문에 관한 것이 아닙니다. –

+0

나는 mmap을 사용하지 않고 boost :: iostreams :: mapped_file을 사용하고있다. 그것이 내 문제와 관련이 있습니다. – Pietro

2

메모리 파일이 메모리의 영역으로 표시하는 파일의 내용을 일으키는 원인에 대해 구체적으로 매핑 된 참조하여 프로그램. 그들은 특별한 'in memory'파일을 만드는 것이 아닙니다. Boost의 개념은 유닉스의 mmap 시스템 호출과 다른 대부분의 운영 체제의 유사한 기능을 사용할 수 있는지 직접 가져온 것입니다. 이 기능을 둘러싼 일반적인 래퍼로 설계되었습니다.

두 개의 프로세스가 공유하는 메모리 영역을 만드는 것이면 메모리 매핑 된 파일이이를 대신 수행 할 수 있지만 해당 메모리의 내용을 반영하는 디스크상의 파일이 필요합니다. 리눅스에서는 파일 내용이 단순히 메모리에 캐시 될 것이고 파일 내용에 해당하는 프로그램의 메모리 페이지는 캐시에서 사용되는 것과 똑같은 물리적 페이지가 될 것이기 때문에 이것은 여전히 ​​상당히 효율적입니다.

당신이 원하는 것은 단지 램 디스크 인 경우

...

대부분의 최신 운영 체제는 프로세스가 필요하지 않은 디스크 캐시 메모리를 사용합니다. 램 디스크가 필요 없습니다. 리눅스에서는 tmpfs이라는 파일 시스템 유형이 있습니다.이 파일 시스템은 부트간에 지속될 필요가없는 파일 시스템에 사용할 수 있습니다. 파일은 일반적으로 메모리에 있지만 다른 종류의 메모리처럼 스왑 할 수 있습니다.

예, 시스템 V 공유 메모리가 있으며 완전히 저조한 디자인입니다. 나는 10 피트 극으로 sys V 프로세스 간 통신 프리미티브를 건드리지 않을 것이다.

+0

그래서 tmpfs는 하드 디스크를 전혀 건드리지 않습니다 (꽉 찼거나 "flush"가 필요하지 않은 경우)? – Pietro

+0

@ 피에트로, 일종의. tmpfs 페이지는 다른 메모리 페이지처럼 취급됩니다. 그래서 그들은 시스템이 메모리 부족 상태에있을 때 교체 될 것입니다. – Omnifarious