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

Lesezeit: 4 Minuten

Benutzeravatar von BowPark
BowPark

In diesem Thread wird die Verwendung des OP vorgeschlagen mmap() Anstatt von shmget() Shared Memory unter Linux zu erhalten. ich besuchte Dies Seite und Dies Seite, um etwas Dokumentation zu erhalten, aber die zweite gibt ein obskures Beispiel bzgl mmap().

Da ich fast ein Neuling bin und einige Informationen (in Textform) zwischen zwei Prozessen austauschen muss, sollte ich die verwenden shmget() Methode bzw mmap()? Und warum?

Benutzeravatar von Sergey L
Sergej L.

Beide Methoden sind praktikabel. mmap Methode ist dann etwas restriktiver shmgetaber 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 erstellen fork dann mmap mit MAP_ANONYMOUS | MAP_SHARED ist bei weitem der einfachste Weg – nur ein Anruf. MAP_ANONYMOUS ist jedoch eine Linux-Erweiterung nicht von POSIX angegeben.
  • Wenn Sie die Prozesse selbstständig starten, können Sie diese dann aber mit einem Shared-Memory-Namen versorgen shm_open (+ ftruncate) + mmap mit MAP_SHARED ist zwei/drei Anrufe. Erfordert librt auf einigen Betriebssystemen.
  • Wenn Ihr Betriebssystem hat /dev/shm/ dann shm_open entspricht dem Öffnen einer Datei in /dev/shm/.

  • Vielen Dank für all die nützlichen Ratschläge. Fork werde ich erstmal nicht verwenden.

    – Bogenpark

    23. Januar 2014 um 15:14 Uhr

  • Aber mit mmap wird eine Datei auf der Festplatte automatisch geändert, wenn Sie den Speicher ändern? Sie verursachen also häufige Schreibvorgänge in dieser Datei?

    – Bogenpark

    23. Januar 2014 um 15:15 Uhr

  • /dev/shm ist deine Ramdisk. Wenn Sie File-Backed Shared Memory verwenden mmap eine Datei, die sich auf einer tatsächlichen Festplatte befindet, dann ist es Sache des Betriebssystems, Updates zu planen. Normalerweise wird die zugeordnete Datei erst aktualisiert, wenn Sie die Zuordnung beendet haben oder der Paging-Daemon entschieden hat, Ihre Seiten auszutauschen. Sie können eine Aktualisierung erzwingen, indem Sie anrufen msync Dies ist die empfohlene Vorgehensweise, wenn Sie dateigestützte Mappings verwenden, die Sie auf die Festplatte schreiben möchten.

    – Sergej L.

    23. Januar 2014 um 15:18 Uhr


  • Der mit MAP_ANONYMOUS zugeordnete @BowPark-Speicher wird NICHT durch eine Datei gesichert.

    – PSkočik

    14. August 2015 um 13:14 Uhr

  • Unter OSX möchten Sie mmap, da der maximale gemeinsam genutzte Speicher mit shmget leider nur 4 MB für alle Prozesse beträgt.

    – Gregor Ray

    25. März 2017 um 6:38 Uhr

Ducks Benutzeravatar
Ente

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, sind die sysV-Versionen 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 Sie ernsthaft bezweifeln müssen, 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 das klobige 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 (z 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 möglicherweise nutzen möchten.

  • Können Sie erklären, warum Sie glauben, dass die System V-Versionen leistungsfähiger sind?

    – Durchscheinender Schmerz

    23. Januar 2014 um 16:08 Uhr

  • Mächtig ist vielleicht das falsche Wort. Voller vorgestellt vielleicht? Zum Beispiel reichen sysv-Semaphore von positiven bis negativen Zahlen, können addiert oder subtrahiert werden, können eine Operation rückgängig machen, wenn ein Prozess stirbt, können den letzten Prozess melden, der sie verarbeitet hat (das wäre nützlicher, wenn dies erweitert würde, um Threads zu melden). sind im Kernel vorhanden, sodass Sie sich nicht mit dem gemeinsamen Speicher herumschlagen müssen, und Sie können einen ganzen Satz davon auf einmal erstellen. sysv-MQs verfügen über msgtypes, die es vielen Prozessen ermöglichen, problemlos dieselbe Warteschlange gemeinsam zu nutzen und nur einen bestimmten Typ zu verarbeiten. Posix-MQs lesen immer die älteste Nachricht mit Priorität

    – Ente

    24. Januar 2014 um 4:03 Uhr

1417080cookie-checkGemeinsamer Linux-Speicher: shmget() vs. mmap()?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy