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 dannmmap
mitMAP_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
mitMAP_SHARED
ist zwei/drei Anrufe. Erfordertlibrt
auf einigen Betriebssystemen. - Wenn Ihr Betriebssystem
/dev/shm/
hat dannshm_open
entspricht dem Öffnen einer Datei in/dev/shm/
.