Java中的内存映射文件:问题太多了?

7

内存映射文件(根据规范)在很大程度上依赖于操作系统的实际实现,其中一些未知方面已经在javadoc中解释。但是我有一些额外的问题,不确定应该向谁寻求答案。

假设应用程序A将文件从位置=0大小=10映射到内存。

我会认为操作系统需要连续的内存块来进行映射吗?还是这取决于具体实现?

现在假设我们有一个应用程序B,它从位置=0大小=11进行映射。前10个字节是共享的,还是完全不同的映射?这与连续内存的问题有关。

如果我们想要使用映射文件进行IPC,则需要了解数据如何反映在其他应用程序中,所以如果B写入内存,A是否能看到这个变化?

然而,根据规范,这取决于操作系统。这使得它在通用IPC方面的使用非常危险,因为它破坏了可移植性,对吗?

此外,假设操作系统支持它,因此B写入内存,A看到了更改,如果我们这样做会发生什么:

B.write("something");
A.write("stuff");
A.read();

A将会读取什么?
或者换句话说:

文件指针是如何管理的?
在并发情况下它是如何工作的?是否存在跨应用程序锁定?

1个回答

1

您可以假设每个操作系统都会按块来执行内存映射,这些块的大小通常是2的幂或2的倍数,并且明显大于11字节。

因此,无论您是从0到10还是从1到11进行映射,底层系统很可能会建立一个从0到块大小的逻辑地址 X 的映射,这对于Java程序员来说是完全隐藏的,因为返回的ByteBuffer具有自己的地址指针和容量,所以它总是可以调整,例如,position 0将得到address X + 1。但底层系统或Java的MappedByteBuffer是否执行必要的转换并不重要。

通常,操作系统将对相同文件区域的映射使用相同的物理内存块,因此这是一种合理的建立IPC的方式,但正如您已经猜到的那样,这确实取决于操作系统而且不可移植。不过,如果您将其设置为可选,并允许知道其系统支持它的用户启用它,则可能会很有用。

关于您关于两次写入的问题,当两个应用程序同时向同一位置写入时,结果完全是不可预测的。

将文件区域映射与锁定分开,但您可以使用文件通道API锁定正在映射的区域以获得独占访问权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接