10
votes

Communication entre les processus avec des résultats de mémoire partagée zéro-copie?

J'écris un démon de réseau, sur Linux avec le noyau 2.6, qui a Un processus de producteur et N de processus de consommation , ce qui ne modifie pas les données et ne crée aucune réponse au producteur.

Chaque fois que le processus de production produit un objet de données, dont la longueur varie de quelques octets à quelques octets de 10 k octets, il doit transmettre l'objet de données en un processus de consommation disponible.

première fois, j'ai envisagé d'utiliser un tuyau nommé / Sans nom. Cependant, ils seraient des frais de copie mémoire.

  1. Tampon de l'espace utilisateur du producteur - Copy -> Buffer de tuyau d'espace de noyau
  2. Tableau de tuyau de l'espace du noyau - Copy -> Tampon de l'espace utilisateur du consommateur

    Puisque le programme peut fonctionner avec un grand nombre de pairs à faible latence, La copie-charge pourrait être nocive. Ainsi, j'ai décidé d'utiliser la mémoire partagée POSIX avec MMAP ().

    Je me demande simplement si le partage des données entre les processus utilisant POSIX partagée avec MMAP () ne résulte pas de la copie mémoire , contrairement à la conduite.

    Aussi, y a-t-il d'autre moyen de partager des données entre les processus, mais des résultats zéro-copie? Le programme sera exécuté sur Linux avec une version récente du noyau et peut ne pas avoir à avoir une capacité multi-plate-forme.

    J'ai décidé de ne pas dépasser / courir un fil pour chaque consommateur / produit, mais un processus En raison de problèmes de conception.

    Merci pour la réponse.


0 commentaires

3 Réponses :


2
votes

La mémoire partagée ne doit introduire aucune copie (cohérence de cache exceptée) et vous pouvez accéder directement à la mémoire afin que vous puissiez éviter les copies de votre code.


0 commentaires

6
votes

La mémoire partagée en général est conçue spécifiquement pour ne pas causer de frais de copie (source: http://www.boost.org/doc/libs/1_46_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.sharedmemory.shared_memory_what_is ).

Si vous utilisez C ++, Boost :: Interprocess est une excellente bibliothèque de mise en œuvre de ce que vous décrivez sous une manière multiple - vous pouvez utiliser leur classe de mémoire partagée combinée à un nommé_upgradable_mutex. La classe Named_upGradable_Mutex est prise en charge pour donner des verrous exclusives et sharables sur une ressource. Vous pouvez donc facilement mettre en œuvre votre modèle de producteur de consommateur. (Source: http: // www.boost.org/doc/libs/1_37_0/doc/html/boost/interprocess/named_upgradable_mutex.html#id2913393-bb )


0 commentaires

0
votes

Oui, il devrait être zéro-copie.

Cependant, c'est également une optimisation (éventuellement prématurée) et vous devez prendre des précautions considérables pour vous assurer que vos processus coopèrent correctement avec une allocation / une modification / modification de la mémoire partagée. Vous auriez certainement besoin d'une sorte de mutex pour éviter les problèmes d'accès simultanés.

Personnellement, j'utiliserais des tuyaux jusqu'à ce que la performance devienne un problème approprié. Si c'est vraiment le cas, la suggestion d'utiliser Boost Boost :: Interprocess ou une bibliothèque similaire est raisonnable.


1 commentaires

Décider de la manière dont les grandes quantités de données sont déplacées entre les processus n'est pas "optimisation prématurée", c'est "l'architecture nécessaire". Toutes l'optimisation (ou la conception ou l'architecture) ne sont pas "prématurées".