gpt4 book ai didi

java - 如果我有两个映射到同一文件的内存映射缓冲区,插入顺序是什么?

转载 作者:行者123 更新时间:2023-12-02 05:35:23 24 4
gpt4 key购买 nike

我的问题是操作系统是否会尊重插入顺序(即最后写入、最后写入磁盘),否则顺序将不可预测。例如:

    byte[] s1 = "Testing1!".getBytes();
byte[] s2 = "Testing2!".getBytes();
byte[] s3 = "Testing3!".getBytes();

RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
FileChannel fc = raf.getChannel();
MappedByteBuffer mbb1 = fc.map(MapMode.READ_WRITE, 0, 1024 * 1024);
mbb1.put(s1);

MappedByteBuffer mbb2 = fc.map(MapMode.READ_WRITE, mbb1.position(), 1024 * 1024);
mbb2.put(s2);

MappedByteBuffer mbb3 = fc.map(MapMode.READ_WRITE, mbb1.position() + mbb2.position(), 1024 * 1024);
mbb3.put(s3);

mbb1.put(s1); // overwrite mbb2
mbb1.put(s1); // overwrite mbb3

mbb1.force(); // go to file
mbb3.force(); // can this ever overwrite mbb1 in the file?
mbb2.force(); // can this ever overwrite mbb1 in the file?

它总是最后写的,最后写的还是我在这里遗漏了一些东西?

最佳答案

我没有测试过这些,所以我不知道。

但是,坦率地说,我们无法保证任何顺序。

您有 mbb.force() 方法,但这不是写入设备的唯一方法,而只是确保它已被写入。

虚拟机可以随时将页面刷新到设备,使用它认为合适的任何时间表,这自然是极其依赖于平台的(Linux 上的行为可能与 Windows 上的行为不同,它可能甚至从 Linux 到 Linux 或从 Windows 到 Windows 都有所不同)。

似乎您应该进行内部协调,以确保只有一个读/写缓冲区映射到文件的特定区域,并以这种方式管理冲突和重叠,而不是依赖操作系统。

编辑:“保证多个内存映射缓冲区所做的更改是一致的”

简单来说,这意味着底层虚拟机一旦将物理页映射到进程,该映射就会在执行的所有分类映射之间共享。线程问题只是由于 CPU 内存缓存和其他问题造成的。

因此,这保证了所有映射都将在重叠缓冲区中看到相同的数据。但它没有解决缓冲区何时实际写入设备的问题。这些观点仍然是密切相关的。

总的来说,如果您正确处理任何多线程方面,听起来不会有问题,并且要注意您在底层缓冲区中看到的内容可能“在您脚下发生变化”。

关于java - 如果我有两个映射到同一文件的内存映射缓冲区,插入顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25020917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com