Bonne alternative à la mémoire partagée IPC pour les applications Java / C ++ sous Linux
Je suis actuellement en utilisant la mémoire partagée pour l'IPC entre Java et C++, applications, mais à la recherche d'une solution de rechange plus pratique.
Quelqu'un peut conseiller une meilleure méthode avec les mêmes performances et la vitesse?
Merci!
source d'informationauteur SyRenity
Vous devez vous connecter pour publier un commentaire.
Il dépend de la façon dont vous prévoyez d'avoir votre apps interagir. Dans l'environnement POSIX, vous avez des tuyaux, de la mémoire partagée, les sockets, les sémaphores et les files d'attente de messages. Voir cette question: En comparant unix linux CIB pour plus d'informations.
Qu'est-ce que le modèle de l'interaction de vos processus (client/serveur, producteur-consommateur, etc)?
Par expérience personnelle, je dirais que votre meilleur pari serait de tuyaux (puisqu'ils sont juste des fichiers à lire et à écrire octets) ou de prises de courant (puisque les deux langues).
Comme mikelong dit, cela dépend beaucoup de ce que vous faites. Autant que je sache, aucune de ces méthodes IPC ont natif Java liaisons, de sorte que vous allez probablement avoir à utiliser JNI et de faire des liaisons de vous-même, de sorte que tous les différentes méthodes sont à peu près aussi dur. Si vous faites de la transmission de message, si, je vous suggère fortement d'utiliser les files d'attente. Ils sont très facile à utiliser (une fois que vous avez les liaisons), et ont de bonnes performances. Si vous avez besoin de "partager" une certaine ressource, alors vous voudrez probablement pour coller avec de la mémoire partagée.
Car on dirait que vous avez une sorte de client/serveur de chose, je dirais que l'utilisation soit des files d'attente de messages, les sockets de domaine unix, ou des canaux nommés. Il s'agit de la copie de données dans le noyau, de sorte qu'ils ne sont pas tout à fait aussi rapide que la mémoire partagée, mais ils sont encore très rapide. Si vous avez un message de données individuels (petits paquets), aller avec des files d'attente de messages. C'est probablement la solution la plus propre. Si vous avez plus d'un flux de données, utiliser des tubes ou supports. Les Sockets ont l'avantage que vous pouvez facilement le faire en réseau transparente (comme X11) plus tard si vous le voulez, mais ils sont un peu plus difficile à travailler que les tuyaux. La performance est probablement très similaire.
Bien que probablement pas le plus efficace, Java prend uniquement en charge les sockets hors de la boîte (le meilleur je le rappel). Ils sont très souples, juste peut-être pas aussi rapide que les autres options. Comme Zifre mentionné, il vous laisse une opportunité pour la transparence réseau, ainsi que la langue/de liaison de la transparence, comme à peu près toutes les langues prend en charge une bibliothèque de socket de la boîte de ces jours.
Alors que je suis jeter de l'efficacité de la fenêtre, si vous voulez le prendre au prochain niveau, vous pourriez probablement envelopper ce dans un Service Web d'une certaine sorte. L'utilisation d'un serveur web intégré sur le consommateur pour les producteurs de soumettre leurs données.
La meilleure façon de communiquer entre les applications écrites dans des langues différentes est à mon humble avis CORBA. Il existe de très bonnes open source CORBA Orbes. Nous utilisons TAO pour C++ et JacORB pour Java. Il y a aussi des entreprises comme BEC et Remède qui fournissent un soutien technique.
Pour simple mémoire partagée, vous n'avez même pas besoin d'une bibliothèque spéciale:
La variable locale x accessible à l'extérieur du filetage et à l'intérieur, vous permettant de l'utiliser pour transmettre de l'information dans et hors de la thread.