2009-05-24 9 views
9

Est-ce que quelqu'un sait comment les éléments suivants 3 comparer en termes de vitesse:SHMEM vs tmpfs vs mmap

  • mémoire partagée

  • tmpfs (/ dev/SHM)

  • mmap (/ dev/shm)

Merci!

Répondre

8

En savoir plus sur tmpfshere. Ce qui suit est copié à partir de cet article, en expliquant la relation entre la mémoire partagée et tmpfs en particulier.

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) 

Ainsi, lorsque vous utilisez réellement la mémoire partagée POSIX (que j'ai utilisé avant, aussi), puis glibc va créer un fichier à /dev/shm, qui est utilisé pour partager des données entre les applications. Le descripteur de fichier qu'il renvoie se référera à ce fichier, que vous pouvez passer à mmap pour lui indiquer de mapper ce fichier en mémoire, comme il peut le faire avec n'importe quel fichier "réel". Les techniques que vous avez énumérées sont donc complémentaires. Ils ne sont pas en compétition. Tmpfs est juste le système de fichiers qui fournit des fichiers en mémoire comme une technique d'implémentation pour glibc.

À titre d'exemple, il y a un processus en cours d'exécution sur ma boîte actuellement avoir enregistré un tel objet de mémoire partagée:

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

Donc, la vitesse est la même?Comment les fichiers mmap-ouverts sont comparés aux fichiers ouverts glibc habituels? – SyRenity

-1

tmpfs est le plus lent. La mémoire partagée et mmap sont la même vitesse.

+2

pourrait vous expliquer ... s'il vous plaît Merci – hhafez

+1

En effet, il semble que tmpfs effectivement des pouvoirs partagés Mémoire? Et je présume, mmap est seulement rapide en utilisant le tmpfs comme le transport sous-jacent? – SyRenity

2

"Cela dépend." En général, ils sont tous en mémoire et dépendent de la mise en œuvre du système, de sorte que les performances seront négligeables et spécifiques à la plate-forme pour la plupart des utilisations. Si vous vous souciez vraiment de la performance, vous devez définir et définir vos besoins. C'est assez trivial de remplacer l'une de ces méthodes par une autre. Cela dit, la mémoire partagée est la moins intensive car il n'y a pas d'opérations de fichiers impliquées (mais encore une fois, très dépendante de l'implémentation). Si vous avez besoin d'ouvrir et de fermer (map/unmap) à plusieurs reprises, lots de fois, alors cela pourrait être un surcoût significatif.

À la votre!
Sean

1

Par "mémoire partagée", vous voulez dire la mémoire partagée System V, n'est-ce pas?

Je pense que Linux mmap est un tmpfs caché quand vous l'utilisez, donc c'est exactement le même que mmaping un tmpfs.

fichier Faire E/S tmpfs va avoir une pénalité ... la plupart du temps (il y a des cas particuliers où il peut être une solution, comme> 4G dans un processus 32 bits)

+0

Comment ça? Si mmap utilise la mémoire partagée, les performances doivent être les mêmes? – SyRenity

+0

@SyRenity read() et les amis impliquent la copie à partir du cache du tampon du noyau. mmap donne un accès direct aux pages du cache tampon. Donc, mmap est généralement plus rapide. – Eloff