7

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

假设我有两个进程(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);
}

// 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);
}

如果这两种情况都映射到同一个内存空间,也许这两种情况并不重要?

4

0 回答 0