web-dev-qa-db-fra.com

Quand utiliser Pipes vs Quand utiliser la mémoire partagée

Je lis sur divers mécanismes IPC. J'essaie de comprendre les scénarios, où nous utilisons la mémoire partagée et où nous utilisons des canaux nommés (FIFO).

Pipes: plusieurs processus peuvent écrire, mais un seul processus peut lire. L'opération d'écriture est atomique.

Mémoire partagée: plusieurs processus peuvent lire et écrire. Et l'utilisateur doit également fournir une exclusion mutuelle pour la lecture et l'écriture.

Est-ce la seule différence d'application de la mémoire partagée et du canal?

31
vamsi

Essentiellement, les canaux - qu'ils soient nommés ou anonymes - sont utilisés comme un passage de message. Quelqu'un envoie une information au destinataire et le destinataire peut la recevoir. La mémoire partagée ressemble plus à la publication de données - quelqu'un place les données dans la mémoire partagée et les lecteurs (potentiellement nombreux) doivent utiliser la synchronisation, par exemple via des sémaphores pour connaître le fait qu'il existe de nouvelles données et doit savoir lire la région de la mémoire pour trouver les informations.

Avec les tuyaux, la synchronisation est simple et intégrée au mécanisme de tuyau lui-même - vos lectures et écritures gèleront et débloqueront l'application lorsque quelque chose d'intéressant se produit. Avec la mémoire partagée, il est plus facile de travailler de façon asynchrone et de rechercher de nouvelles données de temps en temps, mais au prix d'un code beaucoup plus complexe. De plus, vous pouvez obtenir une communication plusieurs à plusieurs, mais cela nécessite encore plus de travail. En outre, en raison de ce qui précède, le débogage de la communication basée sur les canaux est plus facile que le débogage de la mémoire partagée.

Une différence mineure est que les fifos sont visibles directement dans le système de fichiers tandis que les régions de mémoire partagée ont besoin d'outils spéciaux comme ipcs pour leur gestion au cas où vous par ex. créez un segment de mémoire partagée mais votre application meurt et ne nettoie pas après elle-même (il en va de même pour les sémaphores et de nombreux autres mécanismes de synchronisation que vous devrez peut-être utiliser avec la mémoire partagée).

La mémoire partagée vous donne également plus de contrôle sur la mise en mémoire tampon et l'utilisation des ressources - dans les limites autorisées par le système d'exploitation, c'est vous qui décidez de la quantité de mémoire à allouer et comment l'utiliser. Avec les tuyaux, le système d'exploitation contrôle les choses automatiquement, donc encore une fois vous perdez une certaine flexibilité mais vous êtes soulagé de beaucoup de travail.

Résumé des points les plus importants: canaux de communication un-à-un, moins de codage et de laisser le système d'exploitation gérer les choses, mémoire partagée pour plusieurs, plus de contrôle manuel sur les choses, mais au prix de plus de travail et d'un débogage plus difficile.

49
Michał Kosmulski