この質問は何日も私を混乱させてきました:
同じマシンで実行される 2 つのプロセス (p_writeと) があるとします。p_read
プロセス
p_writeは、mmap ファイルを書き込み/更新するためのものです。プロセス
p_readは、mmap ファイルを消費する、つまり、mmap ファイルから読み取るためのものです。
ここでの私の仮定は、p_write最初に mmap ファイルにメモリ領域 (オフヒープ) を割り当てる必要があるということです (領域は、Java MappedByteBufferAPI を使用して自動的にファイルにマップされます)。
ここでの私の質問は、p_read が mmap ファイルからどのように読み取るかです。私の仮定では、p_readマップ先の mmap ファイルに別の同じサイズのオフヒープ領域を割り当てる必要もありますが、このシナリオではメモリ量を 2 倍にする必要があるため、これは正しくないようです。
p_readマップ先の mmap ファイルに別のメモリ空間を割り当てる必要がない場合p_read、 によってファイルがマップされた正しいメモリ アドレスをどのように知ることができますp_writeか?
更新 1
または、これをフォローアップの質問と見なすことができます:FileChannel.map()が 2 回呼び出された場合、同じファイルが 2 つの異なるメモリ空間に 2 回マップされますか?
// Scenario A: In single process
try (FileChannel fc = FileChannel.open(filePath, openOptions)) {
// First call
fc.map(MapMode.READ_ONLY, 0, SIZE_CONSTANT);
// Second call
fc.map(MapMode.READ_ONLY, 0, SIZE_CONSTANT);
}
と
// Scenario B: In two processes
// in first process
try (FileChannel fc = FileChannel.open(filePath, openOptions)) {
// First call in first process
fc.map(MapMode.READ_WRITE, 0, SIZE_CONSTANT);
}
...
// in second process
try (FileChannel fc = FileChannel.open(filePath, openOptions)) {
// Second call in second process
fc.map(MapMode.READ_ONLY, 0, SIZE_CONSTANT);
}
2 つのシナリオがすべて 1 つの同じメモリ空間にマップされている場合は、実際には問題にならないのではないでしょうか?