ブーストメモリを通報したファイルをマッピングされた:彼らはRAMの代わりにディスクにアクセスしてください
-
20-09-2019 - |
質問
私はブーストメモリマップされたファイルがどのように機能するかを理解しようとしています。次のコードは動作しますが、それが行うことになっているものを行いますが、問題は、それが生成するファイルが(実行可能ファイルの同じディレクトリにある)ディスクの代わりに、メモリに格納されていることです。たぶんそこにどこかに設定するためのフラグがあるが、私はそれを見つけることができませんでした...
すべての情報を事前に感謝!
#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
解決
メモリマッピングは、メモリにディスクファイルをマッピングします。これを実現するために、ディスク上のファイルが存在しなければならない!
の編集:あなたは、共有メモリを使用するようにあなたのコメントから、を、それが聞こえる - <のhref = "http://www.boost.org/doc/libs/1_41_0/doc/を参照してくださいHTML /プロセス間/ quick_guide.html」のrel = "noreferrer"> http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html の
他のヒント
メモリマップされたファイルは、ファイルの内容はあなたのプログラム内のメモリ領域として表示させることについて、具体的です。彼らは特別な「メモリ内の」ファイルの作成についてではありません。ブーストの概念は、他のほとんどのオペレーティング・システムでのUNIXと同様の施設でmmap
システムコールの利用可能性から直接取得されます。この能力の周りの汎用ラッパーになるように設計されています。
何をやろうとしていることは二つのプロセスによって共有メモリ領域を作成している場合、メモリはファイルがあなたのためにそれを行うことができますマッピングされたが、そのメモリの内容を反映して、ディスク上のファイルを持っていることのコストで。ファイルの内容は、単にメモリにキャッシュされ、ファイルの内容に対応したプログラムのメモリページがキャッシュで使用されていると同じ正確な物理ページになりますので、Linuxではこれはまだ合理的、効率的になります。
何をしたいことがちょうどRAMディスクであれば...
現在のほとんどのオペレーティングシステムは、プロセスで必要とされていないディスクキャッシュ用のメモリを使用します。 RAMディスクのための本当の必要はありません。 Linuxでは、あなたはブーツの間で永続化する必要はありませんファイルシステムのために使用することができますtmpfs
と呼ばれるファイルシステムのタイプがあります。そのファイルは、一般的にメモリになりますが、彼らはメモリの他の並べ替えをすることができ同じようにスワップアウトすることができます。
はい、システムV共有メモリが存在し、それは絶対にひどい設計を有しています。私は10フィートのポールを持つSYS Vのプロセス間通信プリミティブを触れないでしょう。