GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden von Dateien für Shared Memory IPC

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 und write(...) 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

Linux
  1. Wie kann man gelöschte Dateien unter Linux mit dem Scalpel-Datenwiederherstellungstool wiederherstellen?

  2. Grep:Speicher erschöpft?

  3. Verwenden von rsync zum Synchronisieren von Dateien

  4. CentOS / RHEL 6 :So begrenzen Sie Speicherressourcen für einen bestimmten Benutzer mithilfe von cgroups

  5. Wie listet man Prozesse auf, die an ein Shared-Memory-Segment in Linux angehängt sind?

So überprüfen Sie den gemeinsam genutzten Linux-Speicher mit dem ipcs-Befehl

Tipps zur Verwendung von tmux

Tipps zur Verwendung des Bildschirms

So installieren und verwenden Sie Okteta für RAW-Datendateien unter Linux

So suchen Sie nach Dateien mit Regex im Linux-Shell-Skript

Verwenden von /proc/stat für die Anzahl der Prozesse, die auf dem System ausgeführt werden