同じファイルにマッピングされた2つのメモリマップバッファがある場合は、挿入順序は何ですか?
-
21-12-2019 - |
質問
私の質問は、OSが挿入順(最後に書かれた、最後のディスク)を尊重するか、順序が予測不可能であるかどうかです。例えば:
byte[] s1 = "Testing1!".getBytes();
byte[] s2 = "Testing2!".getBytes();
byte[] s3 = "Testing3!".getBytes();
RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
FileChannel fc = raf.getChannel();
MappedByteBuffer mbb1 = fc.map(MapMode.READ_WRITE, 0, 1024 * 1024);
mbb1.put(s1);
MappedByteBuffer mbb2 = fc.map(MapMode.READ_WRITE, mbb1.position(), 1024 * 1024);
mbb2.put(s2);
MappedByteBuffer mbb3 = fc.map(MapMode.READ_WRITE, mbb1.position() + mbb2.position(), 1024 * 1024);
mbb3.put(s3);
mbb1.put(s1); // overwrite mbb2
mbb1.put(s1); // overwrite mbb3
mbb1.force(); // go to file
mbb3.force(); // can this ever overwrite mbb1 in the file?
mbb2.force(); // can this ever overwrite mbb1 in the file?
.
常に最後に書かれていますか、最後に、ここに何か欠けているのですか?
解決
私はこれのいずれかをテストしていないので、私は知りません。
しかし、率直に言って、この注文のいずれかについての保証はありません。
mbb.force()
メソッドを持ちますが、デバイスに書き込む唯一の方法ではなく、それが書き込まれただけであることを保証します。
VMは、それが適合するスケジュールを使用して、それが適合したときにそれがそれが似ているときはいつでも、それがそれがそれがどんなスケジュールを使ってもよい。 LinuxからLinuxまたはWindowsからWindowsにさえ異なります)。
は、ファイルの特定の領域にマッピングされている読み取り/書き込みバッファを1つだけ持ち、オペレーティングシステムに頼るのではなく、1つの読み取り/書き込みバッファを1つだけ管理し、その競合を管理し、その方法を重複していることがわかります。
編集:「複数のメモリマッピングバッファによって行われる変更は一貫性があることが保証されています」
単に、基礎となるVMがプロセスにマッピングされると、そのマッピングは実行されたすべての盛り合わせマッピングにわたって共有されることを意味します。スレッドの問題は、単にCPUメモリのキャッシュやその他の問題によるものです。
だから、これはすべてのマッピングが重複バッファ内で同じデータを見ることを保証します。しかし、バッファが実際にデバイスに書き込まれたときには対処しません。それらの点はまだゲルマンです。
全体的にそれはあなたが正しくマルチスレッドの側面を扱う場合に問題がないように聞こえ、あなたの基礎となるバッファーに表示されるものが「あなたの足の下に変える」ことを知ってください。