2014-03-04 4 views
7

Memory Mapped Files sind (je nach Spezifikation) weitgehend abhängig von der tatsächlichen Implementierung des Betriebssystems und einige dieser unbekannten Aspekte sind bereits im Javadoc erklärt. Ich habe jedoch einige zusätzliche Fragen und bin mir nicht sicher, wo ich Antworten finden soll.Speicherkarten in Java: zu viele Fragen?

Angenommen, application A ordnet eine Datei dem Speicher von position=0 bis size=10 zu.

Ich würde annehmen, dass das Betriebssystem ein kontinuierliches Stück Speicher benötigt, um es zuzuordnen? Oder hängt das von der Implementierung ab?

Angenommen, wir haben eine application B, die von position=0 bis size=11 abbildet. Sind die ersten 10 Bytes geteilt oder ist es ein völlig anderes Mapping? Dies bezieht sich auf die Frage des kontinuierlichen Speichers.

Wenn wir gemappte Dateien für IPC verwenden möchten, müssen wir wissen, wie sich die Daten in anderen Anwendungen widerspiegeln, also wenn B in den Speicher schreibt, sieht das A?

Wie ich jedoch die Spezifikation lese, hängt dies vom Betriebssystem ab. Dies macht es gefährlich, für allgemeine IPC zu verwenden, da es Portabilität zerstört, richtig?

Zusätzlich nehme an, das OS es nicht unterstützt, so B schreibt in den Speicher, A die Veränderung sieht, was passiert, wenn wir dies tun:

B.write("something"); 
A.write("stuff"); 
A.read(); 

Was genau A lesen?
Oder andersherum:

Wie werden die Dateizeiger verwaltet?
Wie funktioniert es mit Nebenläufigkeit, gibt es Cross-Application-Locking?

Antwort

1

Sie können davon ausgehen, dass jedes Betriebssystem die Speicherzuordnung in Form von Blöcken durchführt, die normalerweise eine Größe von zwei oder mehr als zwei und deutlich mehr als 11 Byte haben.

Also unabhängig davon, ob Sie von 0 bis 10 Karte oder von 1 bis 11, wird das zugrunde liegende System wahrscheinlich eine Zuordnung von 0 bis Blockgröße zu einer logischen Adresse einzurichten X der mit dem Java-Programmierer als die versteckt wird perfekt wird zurückgegeben ByteBuffer hat seinen eigenen Adresszeiger und Kapazität, so dass es immer so eingestellt werden kann, dass z Position 0 Ausbeute Adresse X + 1. Aber ob das zugrunde liegende System oder Java MappedByteBuffer führt die notwendige Übersetzung nicht wichtig ist.

Normalerweise verwenden Betriebssysteme den gleichen physischen Speicherblock für eine Zuordnung zu derselben Region der gleichen Datei, so dass es eine vernünftige Methode zum Einrichten von IPC ist, aber wie Sie bereits erraten haben, hängt das Betriebssystem davon ab und nicht tragbar. Dennoch kann es nützlich sein, wenn Sie es optional machen und der Benutzer, der weiß, dass sein System es unterstützt, es aktivieren kann.

In Bezug auf Ihre Frage zu den zwei Schreibvorgänge, natürlich, wenn zwei Anwendungen gleichzeitig an den gleichen Speicherort schreiben, ist das Ergebnis völlig unvorhersehbar.

Das Zuordnen eines Dateibereichs ist unabhängig vom Sperren, aber Sie können die API des Dateikanals verwenden, um die Region, die Sie zuordnen, für exklusiven Zugriff zu sperren.