2009-05-24 4 views
9

jemand kennt, wie gut die folgenden 3 in Bezug auf Geschwindigkeit vergleichen:shmem vs tmpfs vs Mmap

  • Shared Memory

  • tmpfs (/ dev/shm)

  • mmap (/ dev/shm)

Dank!

Antwort

8

Lesen Sie mehr über tmpfshere. Folgendes wird aus diesem Artikel kopiert, um die Beziehung zwischen dem gemeinsam genutzten Speicher und insbesondere tmpfs zu erklären.

1) There is always a kernel internal mount which you will not see at 
    all. This is used for shared anonymous mappings and SYSV shared 
    memory. 

    This mount does not depend on CONFIG_TMPFS. If CONFIG_TMPFS is not 
    set the user visible part of tmpfs is not build, but the internal 
    mechanisms are always present. 

2) glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for 
    POSIX shared memory (shm_open, shm_unlink). Adding the following 
    line to /etc/fstab should take care of this: 

    tmpfs /dev/shm tmpfs defaults 0 0 

    Remember to create the directory that you intend to mount tmpfs on 
    if necessary (/dev/shm is automagically created if you use devfs). 

    This mount is _not_ needed for SYSV shared memory. The internal 
    mount is used for that. (In the 2.3 kernel versions it was 
    necessary to mount the predecessor of tmpfs (shm fs) to use SYSV 
    shared memory) 

Also, wenn Sie tatsächlich POSIX Shared Memory verwenden (was ich vorher benutzt, auch), dann glibc wird eine Datei an /dev/shm erstellen, die verwendet wird, um Daten zwischen den Anwendungen zu teilen. Der Dateideskriptor, den es zurückgibt, verweist auf diese Datei, die Sie an mmap weiterleiten können, um sie anzuweisen, diese Datei in den Speicher abzulegen, wie es auch mit jeder "echten" Datei möglich ist. Die Techniken, die Sie aufgelistet haben, sind somit komplementär. Sie konkurrieren nicht. Tmpfs ist nur das Dateisystem, das In-Memory-Dateien als Implementierungstechnik für glibc bereitstellt.

Als Beispiel wird ein Prozess gibt es auf meiner Box läuft zur Zeit ein solches Shared-Memory-Objekt registriert haben:

# pwd 
/dev/shm 
# ls -lh 
insgesamt 76K 
-r-------- 1 js js 65M 24. Mai 16:37 pulse-shm-1802989683 
# 
+0

So ist die Geschwindigkeit gleich?Wie werden mmap-geöffnete Dateien mit den üblichen glibc geöffneten Dateien verglichen? – SyRenity

-1

tmpfs ist die langsamste. Gemeinsamer Speicher und mmap sind die gleiche Geschwindigkeit.

+2

könnten Sie bitte erklären ... Danke – hhafez

+1

der Tat scheint es, dass tmpfs tatsächlich geteilten Zuständigkeiten Erinnerung? Und ich nehme an, mmap ist nur schnell, wenn die tmpfs als zugrunde liegender Transport verwendet werden? – SyRenity

2

"Es kommt darauf an." Im Allgemeinen sind sie alle im Arbeitsspeicher und abhängig von der Systemimplementierung, so dass die Leistung für die meisten Anwendungen vernachlässigbar und plattformspezifisch ist. Wenn Ihnen die Leistung wirklich wichtig ist, sollten Sie Ihre Anforderungen profilieren und festlegen. Es ist ziemlich trivial, irgendeine dieser Methoden durch eine andere zu ersetzen.

Das heißt, Shared Memory ist am wenigsten intensiv, da keine Dateioperationen beteiligt sind (aber wiederum sehr implementierungsabhängig). Wenn Sie öfters Lots öffnen und schließen (map/unmap) müssen, dann könnte es zu erheblichen Mehrkosten kommen.

Prost!
Sean

1

Mit "Shared Memory" meinen Sie System V Shared Memory, richtig?

Ich denke, Linux mmap ist eine versteckte tmpfs, wenn Sie dies verwenden, so ist es effektiv das gleiche wie mmaping a tmpfs.

Doing Datei-I/O auf tmpfs eine Strafe haben wird ... meistens (es gibt spezielle Fälle, in denen es sinnvoll sein könnte, wie> 4G in einem 32-Bit-Prozess)

+0

Wie so? Wenn mmap Shared Memory verwendet, sollte die Leistung gleich sein? – SyRenity

+0

@SyRenity read() und Freunde beinhalten das Kopieren aus dem Kernel-Puffer-Cache. mmap gibt direkten Zugriff auf die Seiten im Puffer-Cache. So ist mmap normalerweise schneller. – Eloff