J'écris un démon de réseau, sur Linux avec le noyau 2.6, qui a
Un processus de producteur strong> et N de processus de consommation forts>, ce qui ne modifie pas les données et ne crée aucune réponse au producteur. P>
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. P>
première fois, j'ai envisagé d'utiliser un tuyau nommé / Sans nom. Cependant,
ils seraient des frais de copie mémoire. p>
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 (). P>
Je me demande simplement si le partage des données entre les processus utilisant 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. P>
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. P>
Merci pour la réponse. P>
3 Réponses :
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. P>
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 ). p>
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 ) P>
Oui, il devrait être zéro-copie. p>
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. P>
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. P>
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".