web-dev-qa-db-fra.com

Plus rapide IPC sur Windows 7

Quelle est la méthode de communication interprocessus (IPC) la plus rapide possible sous Windows 7? Nous aimerions partager uniquement un bloc de mémoire (bidirectionnel).

Est-ce ReadProcessMemory ou autre chose? Nous aimerions utiliser plain C mais, par exemple, qu'est-ce que la bibliothèque Boost utilise pour IPC?

38
Cartesius00

ReadProcessMemory ne devrait même pas être répertorié en tant que IPC; oui, il peut être utilisé comme tel, mais il existe principalement à des fins de débogage (si vous vérifiez sa référence, il s'agit de dans la catégorie "Fonctions de débogage"), et elle est sûrement plus lente que la "vraie" mémoire partagée car elle copie la mémoire d'un processus dans le tampon spécifié, tandis que la mémoire partagée réelle n'a pas cette surcharge.

La liste complète des méthodes IPC prises en charge par Windows est disponible sur le MSDN ; cependant, si vous n'avez que deux applications qui souhaitent partager un bloc de mémoire, vous devez créer un fichier nommé mappé en mémoire (soutenu par le fichier d'échange) avec CreateFileMapping/MapViewOfFile, qui devrait être la méthode la plus simple et la plus rapide. Les détails du mappage de fichier sont décrits sur sa page sur MSDN.

Boost pertinent IPC classes peut agir comme un wrapper mince autour de la mémoire partagée, AFAIK il encapsule uniquement les appels aux API spécifiques au système, mais à la fin vous obtenir le pointeur habituel sur le bloc de mémoire partagée, donc l'opération devrait être aussi rapide que l'utilisation des API natives.

Pour cette raison, je vous conseille d'utiliser Boost.Interprocess , car il est portable, compatible C++ (il fournit la sémantique RAII) et ne vous donne aucune pénalité de performance après la création du bloc de mémoire partagée (il peut fournir des fonctionnalités supplémentaires sur la mémoire partagée, mais ils sont tous opt-in - si vous voulez juste de la mémoire partagée, vous l'obtenez juste).

49
Matteo Italia