[英]Memory mapped files in java: too many questions?
内存映射文件(根据规范)在很大程度上取决于操作系统的实际实现,并且已经在javadoc中解释了许多这些未知方面。 但是我有一些额外的问题,不知道在哪里寻求答案。
假设application A
将文件从position=0
映射到内存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
究竟会读什么?
或者换句话说:
如何管理文件指针?
如何使用并发,是否有跨应用程序锁定?
您可以假设每个操作系统都将根据块执行内存映射,这些块的大小通常是2的幂的倍数中的2的幂,并且明显大于11个字节。
因此无论您是从0映射到10还是从1映射到11,底层系统都可能建立从0到块大小到逻辑地址X的映射,这对于Java程序员来说是完全隐藏的,因为返回的ByteBuffer
有自己的地址指针和容量,所以它总是可以调整,以便,例如位置 0屈服于地址X + 1.但是底层系统或Java的MappedByteBuffer
执行必要的转换并不重要。
通常,操作系统最终会使用相同的物理内存块来映射到同一文件的同一区域,因此这是建立IPC的合理方法,但正如您已经猜到的那样,这确实取决于操作系统而且不可移植。 尽管如此,如果您将其设为可选项并让知道其系统支持的用户可以启用它,那么它可能会很有用。
关于这两个写操作的问题,当然,如果两个应用程序同时写入同一个位置,结果是完全不可预测的。
映射文件区域与锁定无关,但您可以使用文件通道API锁定要映射的区域以获得独占访问权限。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.