この質問は何日も私を混乱させてきました:
同じマシンで実行される 2 つのプロセス (p_write
と) があるとします。p_read
プロセス
p_write
は、mmap ファイルを書き込み/更新するためのものです。プロセス
p_read
は、mmap ファイルを消費する、つまり、mmap ファイルから読み取るためのものです。
ここでの私の仮定は、p_write
最初に mmap ファイルにメモリ領域 (オフヒープ) を割り当てる必要があるということです (領域は、Java MappedByteBuffer
API を使用して自動的にファイルにマップされます)。
ここでの私の質問は、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 つの同じメモリ空間にマップされている場合は、実際には問題にならないのではないでしょうか?