7

この質問は何日も私を混乱させてきました:

同じマシンで実行される 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 つの同じメモリ空間にマップされている場合は、実際には問題にならないのではないでしょうか?

4

0 に答える 0