2014-07-21 15 views
11

Was ist der Vorteil zu tun: shm_open folgte eine mmap?
Warum nicht eine reguläre Datei erstellen und diese fd an mmap übergeben? Ich kann den Vorteil von shm_open nicht sehen - das sind nur Referenzen, nicht wahr?Warum shm_open verwenden?

Ich habe den Mann der ganzen Familie gelesen. Es scheint mir, dass das "Geheimnis" in der mmaping Aktion liegt - die Datei "type" scheint bedeutungslos zu sein.

Alle Zeiger sind gut, vor allem mit Performance-Konto.
Mein Kontext ist ein (zyklischer überschreibbarer) Puffer (sagen wir 128MB), der ständig in einen Prozess geschrieben wird und ständig von einem anderen gelöscht wird.

Als Beispiel: Was ist los mit this offen/mmap Ansatz.

EDIT
Um genau zu sein, ist eine der folgenden Möglichkeiten besser als die anderen:
fd = open("/dev/shm/myshm.file", O_CREAT|O_RDWR, S_IRUSR | S_IWUSR); mem = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); gegen
fd = shm_open("/myshm.file", O_RDWR|O_CREATE, S_IRUSR | S_IWUSR); mem = mmap(...same as before...);
Wenn ich eine Datei mit regelmäßigen open unter den /dev/shm fs erzeugt, und schüttete ein Gig von Müll, mein verfügbarer Speicher ging um 1G herunter, und mein verfügbarer Speicherplatz blieb gleich.
Was ist der Unterschied zwischen den beiden Methoden?

+0

Versuchen Sie es einfach. Das Schreiben in eine Datei ist vielleicht hundertmal langsamer. –

Antwort

12

Wenn Sie eine reguläre Datei öffnen und mmap() öffnen, werden die Daten in dieser Datei gespeichert.

Wenn Sie nur eine Speicherregion freigeben müssen, ohne die Daten persistieren zu müssen, was zusätzlichen E/A-Overhead zur Folge hat, verwenden Sie shm_open().

Eine solche Speicherregion ermöglicht es Ihnen auch, andere Arten von Objekten wie Mutexe oder Semaphore zu speichern, die Sie auf den meisten Systemen nicht in einer mmap() 'regulären Datei speichern können.

+0

Aber was, wenn ich die Datei unter dem/dev/shm fs erstellt habe? wie so, öffne ("/ dev/shm/myshm", "w")? Was ist der Vorteil von shm_open? – Trevor

+2

Dann wäre es ziemlich ähnlich, wenn Sie shm_open oder open verwenden, aber denken Sie daran, dass das Linux-spezifisch ist. Es wäre ziemlich pontless zu tun, wenn ein Standardansatz existiert. shm_open sorgt dafür, dass/dev/shm gefunden wird, wenn es auch an einem nicht standardmäßigen Ort installiert ist. – nos

+0

Vielen Dank für den Hinweis auf das Problem der Portabilität. Unser Produkt wird als VM an die Kunden ausgeliefert. Daher kontrollieren wir die Verteilung, in der unser Code läuft, damit wir das schaffen können.Was mich an erster Stelle gebracht hat, war die Möglichkeit, logische Verzeichnisse unter/dev/shm fs zu erstellen. Dies ist ein Artefakt von glibcs ​​shm_open und ist kein Problem der fs - also gehe ich mit open(). – Trevor

2

Beiden Anrufe im Wesentlichen gleichwertig auf modernen Linux sind - 1. Ansatz könnte POSIX Shared Memory zugreifen aus Sprachen wie unterwegs verwendet werden (siehe https://github.com/fabiokung/shm/blob/master/shm_linux.go), in dem POSIX-Speicher nicht nativ verfügbar geteilt - es könnte für andere OS/Version unterschiedlich sein, falls Der erste Aufruf würde dazu führen, dass eine Dateierstellung oder/dev/shm einfach nicht verfügbar ist und/oder möglicherweise eine langsamere Leistung hat. Geschäfts Weg könnte auch von Version zu Version von librt

ersten Ansatz namens Speicher API Mapped-Dateien werden sich entwickelnde Zusammenführen (in std Libs unterstützt)

2. POSIX Shared-Memory-API genannt (erfordert librt aka libposix auf Linux als Abhängigkeit Es ist intern konstruiert Pfad und Aufrufe öffnen)