内存映射文件在多进程方案中如何工作?

Lub*_*bor 5 java memory filechannel memory-mapped-files mappedbytebuffer

这个问题困扰我好几天了:

假设我有两个在同一台计算机上运行的进程(p_writep_read)。

  • 过程p_write用于写入/更新mmap文件。

  • 过程p_read是使用mmap文件的过程,换句话说,就是读取mmap文件。

我的假设是,p_write首先需要为mmap文件分配一个内存空间(堆外)(该空间使用Java MappedByteBufferAPI 自动映射到文件)。

我的问题是p_read如何从mmap文件读取?我现在的假设是,p_read还需要为要映射的mmap文件分配另一个相同大小的堆外空间,但这似乎是不正确的,因为在这种情况下,内存量需要加倍。

如果p_read不需要为要映射的mmap文件分配单独的内存空间,那么如何p_read知道文件映射到的正确内存地址p_write

更新1

我发现有一个更好的问题要问,或者您可以将其视为后续问题:如果FileChannel.map()两次调用,同一文件是否将两次映射到两个不同的内存空间?

// 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);
}
Run Code Online (Sandbox Code Playgroud)

// 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);
}
Run Code Online (Sandbox Code Playgroud)

如果将它们都映射到一个相同的内存空间中,那么对于这两种情况也许并不重要?