Domanda

La mia domanda è se il sistema operativo rispetterà l'ordine di inserimento (cioè l'ultima scritta, l'ultimo a disco) o l'ordine sarà imprevedibile.Ad esempio:

    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?
.

è sempre scritto, l'ultima volta o mi manca qualcosa qui?

È stato utile?

Soluzione

Non ho testato nulla di questo, quindi non lo so.

Ma, francamente, non c'è garanzia su nessuno di questo ordine.

Hai il metodo mbb.force(), ma non è l'unico modo per scrivere sul dispositivo, piuttosto assicura che sia stato scritto.

La VM può svuotare la pagina Torna al dispositivo ogni volta che ci si sente, usando qualsiasi programma che ritiene in forma, che è, naturalmente, dipende da una piattaforma estremamente (il comportamento su Linux potrebbe essere diverso dal comportamento su Windows, potrebbe Anche variare da Linux a Linux o Windows a Windows).

sembra essere che dovresti coordinare internamente per assicurarsi di avere solo un buffer di lettura / scrittura mappato su un'area specifica di un file e gestire i conflitti e si sovrappongono in questo modo piuttosto che facendo affidamento sul sistema operativo. .

Modifica: "Le modifiche effettuate da più buffer mappati di memoria sono garantite per essere coerenti"

Semplicemente, ciò significa che la VM sottostante, una volta che una pagina fisica è mappata in un processo, che la mappatura è condivisa su tutte le mappature assortite eseguite. I problemi del filo sono semplicemente dovuti alla memoria della memoria CPU e ad altri problemi.

Quindi, ciò garantisce che tutte le mappature vedranno gli stessi dati all'interno di un buffer sovrapposto. Ma non affronta quando i buffer verranno effettivamente scritti sul dispositivo. Quei punti sono ancora in affitto.

Nel complesso suona come se non avrai un problema se gestisci correttamente gli aspetti multithreading e sii consapevole che ciò che vedi nel tuo buffer sottostante può "cambiare sotto i piedi".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top