【问题标题】:Memory mapped files in java: too many questions?java中的内存映射文件:太多的问题?
【发布时间】:2014-03-04 09:45:24
【问题描述】:

内存映射文件(根据规范)很大程度上依赖于操作系统的实际实现,其中一些未知方面已经在 javadoc 中进行了解释。不过,我还有一些其他问题,不知道该去哪里寻求答案。

假设application A 将文件从position=0 映射到内存到size=10

我会假设操作系统需要一块连续的内存来映射它?还是这取决于实现?

现在假设我们有一个从position=0 映射到size=11application B。 前 10 个字节是共享的还是完全不同的映射?这与连续记忆问题有关。

如果我们要使用映射文件进行 IPC,我们需要知道数据是如何反映在其他应用程序中的,那么如果B 写入内存,A 会看到这个吗?

但是,当我阅读规范时,这取决于操作系统。这使得用于通用 IPC 很危险,因为它破坏了可移植性,对吧?

另外假设操作系统确实支持它,所以B 写入内存,A 看到变化,如果我们这样做会发生什么:

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

A 究竟会读到什么?
或者换一种说法:

如何管理文件指针?
它如何与并发一起工作,是否有跨应用程序锁定?

【问题讨论】:

    标签: java memory-mapped-files


    【解决方案1】:

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

    所以无论你是从 0 映射到 10 还是从 1 到 11,底层系统都可能会建立一个从 0 到 blocksize 到逻辑地址的映射 X作为返回的ByteBuffer 的 Java 程序员有自己的地址指针和容量,因此可以随时调整它,例如位置 0 屈服于地址X + 1。但是底层系统或Java的MappedByteBuffer是否执行必要的转换并不重要。

    通常,操作系统最终将使用相同的物理内存块映射到同一文件的同一区域,因此这是建立 IPC 的合理方法,但正如您已经猜到的那样,这确实取决于操作系统并且不便携。不过,如果您将其设为可选并让知道他的系统支持它的用户可以启用它,它可能会很有用。

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

    映射文件区域独立于锁定,但您可以使用文件通道 API 锁定要映射的区域以获得独占访问权限。

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 2010-11-04
      • 2011-05-14
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      相关资源
      最近更新 更多