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

Gemeinsamer Linux-Speicher:shmget() vs. mmap()?

Vieles davon hat mit Geschichte und zukünftigen Richtungen zu tun.

Es waren einmal zwei Hauptversionen (und etwas konkurrierende) von Unix - System V und BSD. SysV hatte seine eigenen Versionen von IPC, einschließlich der großen 3 – gemeinsam genutzter Speicher, Semaphore und Nachrichtenwarteschlangen. POSIX kam daher, um zu versuchen, Dinge zu vereinen.

Derzeit haben wir also zwei Versionen - Posix Shared Memory, MQs und Semaphore und die sysV-Versionen. Nur um die Dinge etwas verwirrender zu machen, die sysV-Versionen sind auch Teil von Posix.

Ihre Frage ist also, ob Sie gemeinsam genutzten Speicher im Posix- oder SysV-Stil verwenden möchten? Im Allgemeinen nehmen die meisten Menschen die langfristige Perspektive und entscheiden sich für Posix, weil dies der Weg in die Zukunft zu sein scheint. Aber realistischerweise ist sysV-Zeug so in so viele Systeme eingebettet, dass man ernsthaft bezweifeln muss, dass es jemals verschwinden wird.

Wenn Sie also die langfristigen Dinge eliminieren, kommt es darauf an, was für Ihr Projekt und Ihren Geschmack sinnvoll ist. Im Allgemeinen sind die sysV-Versionen tatsächlich etwas leistungsfähiger, aber sie haben eine klobige Oberfläche, die die meisten Leute beim ersten Kontakt etwas verwirrend finden. Dies gilt insbesondere für sysV-Semaphore und Nachrichtenwarteschlangen. In Bezug auf gemeinsam genutzten Speicher kann argumentiert werden, dass sowohl sysV als auch posix umständlich sind. Die sysV-Versionen tragen den klobigen ftok und wichtige Dinge, während die Posix am Ende mehrere Anrufe und einige Rennbedingungen zum Einrichten entgegennimmt. Von außen haben die posix-Versionen den Vorteil, dass sie das Dateisystem nutzen und mit Standard-Befehlszeilenfunktionen wie 'rm' gewartet werden können, anstatt sich auf separate Hilfsprogramme zu verlassen (z. B. ipcs ), die sysV benötigt.

Welche sollten Sie also verwenden? In der Regel sind die posix-Versionen. Aber Sie sollten sich wirklich mit sysV-Versionen vertraut machen. Sie haben einige Funktionen, die über die Möglichkeiten der Posix-Versionen hinausgehen, die Sie in bestimmten Situationen vielleicht nutzen möchten.


Beide Methoden sind praktikabel. mmap Methode ist etwas restriktiver als shmget , aber einfacher zu bedienen. shmget ist das alte Shared-Memory-Modell von System V und hat die breiteste Unterstützung. mmap /shm_open ist die neue POSIX-Methode, um gemeinsam genutzten Speicher zu verwenden, und ist einfacher zu verwenden. Wenn Ihr Betriebssystem die Verwendung von POSIX-Shared-Memory zulässt, würde ich vorschlagen, dies zu tun.

Einige Hinweise:

  • Wenn Sie Ihre Kinder über fork erstellen dann mmap mit MAP_ANONYMOUS | MAP_SHARED ist bei weitem der einfachste Weg - nur ein Anruf. MAP_ANONYMOUS ist jedoch eine von POSIX nicht spezifizierte Linux-Erweiterung.
  • Wenn Sie die Prozesse unabhängig voneinander starten, sie aber mit einem Shared-Memory-Namen versorgen können, dann shm_open (+ ftruncate ) + mmap mit MAP_SHARED ist zwei/drei Anrufe. Erfordert librt auf einigen Betriebssystemen.
  • Wenn Ihr Betriebssystem /dev/shm/ hat dann shm_open entspricht dem Öffnen einer Datei in /dev/shm/ .

Linux
  1. So löschen Sie den Speichercache in Linux

  2. Linux-Out-of-Memory-Killer

  3. Linux Memory Management – ​​Swapping, Caches und Shared VM

  4. Kali Linux 2018.1-Version

  5. So initialisieren Sie eine gemeinsam genutzte Bibliothek unter Linux

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

So löschen Sie den Auslagerungsspeicher unter Linux

Posix-Programmierhandbuch vs. Linux-Programmierhandbuch?

kostenlose Befehlsbeispiele in Linux

ipcs-Befehlsbeispiele unter Linux

Gemeinsam genutzten Posix-Speicher entfernen, wenn er nicht verwendet wird?