Im Wesentlichen versuche ich zu verstehen, was passiert, wenn zwei Prozesse dieselbe Datei gleichzeitig geöffnet haben, und ob man dies verwenden könnte, um die Kommunikation zwischen zwei Prozessen sicher und performant anzubieten.
Wenn Sie normale Dateien verwenden, verwenden Sie read
und write
Operationen (d. h. sie nicht im Speicher abbilden), dann teilen sich die beiden Prozesse keinen Speicher.
- User-Space-Speicher in Java
Buffer
Objekte, die der Datei zugeordnet sind, werden NICHT über Adressräume hinweg gemeinsam genutzt. - Wenn ein
write
Syscall erfolgt, Daten werden kopiert von Seiten im Adressraum eines Prozesses zu Seiten im Kernel-Raum. (Diese könnten Seiten im Seitencache sein. Das ist betriebssystemspezifisch.) - Wenn ein
read
Syscall erfolgt, Daten werden kopiert von Seiten im Kernelraum zu Seiten im Adressraum der Leseprozesse.
Es muss so gemacht werden. Wenn das Betriebssystem freigegebene Seiten, die mit den Lese- und Schreibprozessen verbunden sind, hinter ihrem Rücken puffert, dann wäre das ein Sicherheits-/Informationsleck:
- Der Leser könnte Daten im Adressraum des Schreibers sehen, die noch nicht über
write(...)
geschrieben wurden , und würde es vielleicht nie sein. - Der Writer könnte Daten sehen, die der Reader (hypothetisch) in seinen Lesepuffer geschrieben hat.
- Es wäre nicht möglich, das Problem durch geschickten Einsatz des Speicherschutzes anzugehen, da die Granularität des Speicherschutzes eine Seite gegenüber der Granularität von
read(...)
ist undwrite(...)
das ist so wenig wie ein einzelnes Byte.
Sicher:Sie können das Lesen und Schreiben von Dateien sicher verwenden, um Daten zwischen zwei Prozessen zu übertragen. Aber Sie müssten ein Protokoll definieren, das es dem Leser ermöglicht, zu wissen, wie viele Daten der Schreiber geschrieben hat. Und der Leser weiß wann der Schreiber hat etwas geschrieben, das eine Umfrage nach sich ziehen könnte; z.B. um zu sehen, ob die Datei geändert wurde.
Betrachtet man dies nur im Sinne des Datenkopierens im Kommunikations-"Kanal"
-
Mit speicherabgebildeten Dateien kopieren (serialisieren) Sie die Daten von Anwendungs-Heap-Objekten in den zugeordneten Puffer und ein zweites Mal (deserialisieren) aus dem zugeordneten Puffer in Anwendungs-Heap-Objekte.
-
Bei gewöhnlichen Dateien gibt es zwei zusätzliche Kopien:1) vom Schreibprozess-Puffer (nicht zugeordnet) zu Kernel-Space-Seiten (z. B. im Seiten-Cache), 2) von den Kernel-Space-Seiten zum Leseprozess-Puffer (nicht zugeordnet). .
Der folgende Artikel erklärt, was mit herkömmlichem Lesen / Schreiben und Speicherzuordnung vor sich geht. (Es steht im Zusammenhang mit dem Kopieren einer Datei und "Zero-Copy", aber das können Sie ignorieren.)
Referenz:
- Nullkopie I:Benutzermodus-Perspektive