内存映射文件(根据规范)在很大程度上取决于操作系统的实际实现,并且已经在javadoc中解释了许多这些未知方面。但是我还有一些其他问题,不知道在哪里寻求答案。
假设application A
将文件从position=0
映射到内存size=10
。
我会假设操作系统需要连续的内存来映射它吗?或者这取决于实施?
现在假设我们有application B
从position=0
映射到size=11
。
前10个字节是共享的还是完全不同的映射?这与连续记忆问题有关。
如果我们想使用IPC的映射文件,我们需要知道数据如何在其他应用程序中反映出来,所以如果B
写入内存,A
会看到这个吗?
然而,当我阅读规范时,这取决于操作系统。这使得用于通用IPC变得危险,因为它会破坏可移植性吗?
另外假设操作系统确实支持它,因此B
写入内存,A
会看到更改,如果我们这样做会发生什么:
B.write("something");
A.write("stuff");
A.read();
A
究竟会读到什么?
或者换句话说:
如何管理文件指针?
如何使用并发,是否有跨应用程序锁定?
答案 0 :(得分:1)
你可以假设每个操作系统都会根据块执行内存映射,这些块的大小通常是2的幂的2的幂的2的幂,并且明显大于11个字节。
因此无论您是从0映射到10还是从1映射到11,底层系统都可能建立从0到块大小到逻辑地址 X 的映射,这将完全隐藏到作为返回的ByteBuffer
的Java程序员有自己的地址指针和容量,因此可以随时调整它以便例如位置 0屈服于地址X + 1.但底层系统或Java的MappedByteBuffer
是否执行必要的翻译并不重要。
通常,操作系统最终会使用相同的物理内存块来映射到同一文件的同一区域,因此这是建立IPC的合理方法,但正如您已经猜到的那样,这确实取决于操作系统和不便携。尽管如此,如果你使可选并让知道他的系统支持它的用户可以启用它,它可能会很有用。
关于这两个写操作的问题,当然,如果两个应用程序同时写入同一个位置,结果完全不可预测。
映射文件区域与锁定无关,但您可以使用文件通道API锁定要映射的区域以获得独占访问权。