Frage

Meine Frage ist, ob das Betriebssystem die Einfügereihenfolge respektiert (d. h.zuletzt geschrieben, zuletzt auf die Festplatte) oder die Reihenfolge ist unvorhersehbar.Zum Beispiel:

    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?

Ist es immer zuletzt geschrieben, zuletzt in oder übersehe ich hier etwas?

War es hilfreich?

Lösung

Ich habe nichts davon getestet, daher weiß ich es nicht.

Aber ehrlich gesagt gibt es für diese Bestellung keine Garantie.

Du hast die mbb.force() Methode, aber das ist nicht die einzige Möglichkeit, auf das Gerät zu schreiben, sondern stellt lediglich sicher, dass es geschrieben wurde.

Die VM kann die Seite jederzeit und nach eigenem Ermessen auf das Gerät zurückspülen, was natürlich extrem plattformabhängig ist (das Verhalten unter Linux kann sich vom Verhalten unter Windows unterscheiden, es kann sogar davon abweichen). Linux zu Linux oder Windows zu Windows).

Anscheinend sollten Sie intern koordinieren, um sicherzustellen, dass nur ein Lese-/Schreibpuffer einem bestimmten Bereich einer Datei zugeordnet ist, und die Konflikte und Überschneidungen auf diese Weise verwalten, anstatt sich auf das Betriebssystem zu verlassen.

Bearbeiten:„Änderungen, die von mehreren speicherabgebildeten Puffern vorgenommen werden, sind garantiert konsistent.“

Vereinfacht gesagt bedeutet dies, dass die zugrunde liegende VM, sobald eine physische Seite einem Prozess zugeordnet ist, diese Zuordnung für alle durchgeführten Zuordnungen gemeinsam nutzt.Die Thread-Probleme sind einfach auf das Cachen des CPU-Speichers und andere Probleme zurückzuführen.

Dies stellt sicher, dass alle Zuordnungen dieselben Daten innerhalb eines überlappenden Puffers sehen.Es wird jedoch nicht darauf eingegangen, wann die Puffer tatsächlich auf das Gerät geschrieben werden.Diese Punkte sind immer noch relevant.

Alles in allem hört es sich so an, als ob Sie kein Problem haben werden, wenn Sie alle Multithreading-Aspekte richtig handhaben und sich darüber im Klaren sind, dass sich das, was Sie in Ihrem zugrunde liegenden Puffer sehen, „unter Ihren Füßen ändern“ kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top