Pregunta

Mi pregunta es si el sistema operativo respetará la orden de inserción (es decir, el último escrito, el último en el disco) o el pedido será impredecible.Por ejemplo:

    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?

¿Siempre está escrito por última vez, dure en o estoy perdiendo algo aquí?

¿Fue útil?

Solución

No he probado nada de esto, así que no lo sé.

Pero, francamente, no hay garantía en ninguno de estos pedidos.

Tiene el método mbb.force(), pero esa no es la única forma de escribir en el dispositivo, sino que solo garantiza que se haya escrito.

La VM puede descargar la página al dispositivo siempre que se sienta como si fuera así, usando cualquier horario que considere oportuno, lo cual es, naturalmente, dependiente de la plataforma extremadamente plataforma (el comportamiento en Linux puede ser diferente al comportamiento en Windows, puede incluso varían de Linux a Linux o Windows a Windows).

Parece que debe estar coordinando internamente para asegurarse de que solo tenga un búfer de lectura / escritura asignado a un área específica de un archivo, y administre los conflictos y se superponga a esa manera en lugar de confiar en el sistema operativo.

Editar: "Se garantiza que los cambios realizados por múltiples tampones mapeados de memoria sean consistentes"

Simplemente, esto significa que la máquina virtual subyacente, una vez que una página física se mapa en un proceso, ese mapeo se comparte a través de todas las asignaciones variadas realizadas. Los problemas del hilo se deben simplemente a la memoria cacheada de memoria CPU y otros problemas.

Entonces, esto garantiza que todas las asignaciones verán los mismos datos dentro de un búfer superpuesto. Pero no se aborda cuando los buffers realmente se escribirán en el dispositivo. Esos puntos siguen siendo german.

En general, suena como si no tendrás un problema si maneja correctamente los aspectos multithreadientes, y tenga en cuenta que lo que ve en su búfer subyacente puede "cambiar debajo de sus pies".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top