nab*_*lex 7 java memory-mapped-files
内存映射文件(根据规范)在很大程度上取决于操作系统的实际实现,并且已经在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();
Run Code Online (Sandbox Code Playgroud)
到底会A读到什么?
或者换句话说:
如何管理文件指针?
如何使用并发,是否有跨应用程序锁定?
您可以假设每个操作系统都会以块的形式执行内存映射,块的大小通常是 2 的幂或 2 的倍数的倍数,并且明显大于 11 字节。
\n\n因此,无论您是从 0 映射到 10 还是从 1 到 11,底层系统都可能会建立从 0 到块大小到逻辑地址X的映射,这对 Java 程序员来说是完全隐藏的,因为返回的ByteBuffer地址有自己的地址指针和容量,因此它总是可以调整,例如位置0 屈服于地址 X + 1。但是底层系统或 Java\xe2\x80\x99s 是否MappedByteBuffer执行必要的转换并不重要。
通常,操作系统最终会使用相同的物理内存块来映射到同一文件的同一区域,因此这是建立 IPC 的合理方法,但正如您已经猜到的那样,这确实依赖于操作系统并且不可移植。不过,如果您将其设置为可选,并让知道其系统支持它的用户可以启用它,那么它可能会很有用。
\n\n关于您关于两次写入的问题,当然,如果两个应用程序同时写入同一位置,结果是完全不可预测的。
\n\n映射文件区域与锁定无关,但您可以使用文件通道 API 来锁定您正在映射的区域以获得独占访问权限。
\n| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |