Bonne alternative à la mémoire partagée pour les applications Java / C ++ sous Linux

J’utilise actuellement la mémoire partagée pour IPC entre les applications Java et C ++, mais je recherche une alternative plus pratique.

Quelqu’un peut-il conseiller une meilleure méthode avec la même performance et la même vitesse?

Merci!

Cela dépend de la manière dont vous prévoyez d’interagir avec vos applications. Dans l’environnement POSIX, vous avez des canaux, de la mémoire partagée, des sockets, des sémaphores et des files d’attente de messages. Voir cette question: Comparer unix linux IPC pour plus d’informations.

Quel est le modèle d’interaction pour vos processus (client / serveur, producteur-consommateur, etc.)?

D’après mon expérience personnelle, je vous suggérerais que votre meilleur pari soit des tubes (car ce ne sont que des fichiers pour lire et écrire des octets) ou des sockets (puisque les deux langues les prennent en charge).

Comme l’a dit Mikelong, cela dépend beaucoup de ce que vous faites. AFAIK, aucune des méthodes IPC ne possède de liens Java natifs, vous devrez donc probablement utiliser JNI et créer vous-même des liaisons, de sorte que toutes les méthodes sont à peu près aussi difficiles. Si vous transmettez des messages, je suggère fortement d’utiliser des files d’attente de messages. Ils sont très faciles à utiliser (une fois que vous avez les liaisons) et ont de bonnes performances. Si vous avez besoin de “partager” une ressource, vous voudrez probablement vous en tenir à la mémoire partagée.

Comme il semble que vous ayez quelque chose de client / serveur, je dirais que vous utilisez soit des files de messages, des sockets de domaine unix ou des canaux nommés. Ils impliquent tous la copie de données dans le kernel, ils ne sont donc pas aussi rapides que la mémoire partagée, mais ils sont toujours très rapides. Si vous avez des données de type message (petits paquets individuels), associez-les aux files d’attente de messages. C’est probablement la solution la plus propre. Si vous avez plus d’un stream de données, utilisez des canaux ou des sockets. Les sockets ont l’avantage que vous pouvez facilement rendre le réseau transparent (comme X11) plus tard si vous le souhaitez, mais ils sont légèrement plus difficiles à utiliser que les tubes. La performance est probablement très similaire.

Bien que ce ne soit probablement pas le plus efficace, Java ne prend en charge que les sockets par défaut (le meilleur dont je me souvienne). Ils sont très flexibles, peut-être pas aussi rapides que d’autres options. Comme Zifre l’a mentionné, cela vous donne une opportunité pour la transparence du réseau, ainsi que pour la transparence linguistique / obligatoire; Comme à peu près tous les langages supportent une bibliothèque de sockets prête à l’emploi de nos jours.

Bien que je sois en train de mettre de l’efficacité hors de la fenêtre, si vous souhaitez passer au niveau supérieur, vous pourriez probablement l’emballer dans un service Web. Utilisez un serveur Web intégré sur le consommateur pour que les producteurs puissent soumettre leurs données.

IMHO CORBA est le moyen le plus simple de communiquer entre les applications écrites dans différentes langues. Il existe de très bons ORB open source CORBA . Nous utilisons TAO pour C ++ et JacORB pour Java. Il existe également des sociétés comme OCI et Remedy qui fournissent un support technique.

J’utilise actuellement la mémoire partagée pour IPC entre les applications Java et C ++, mais je recherche une alternative plus pratique.

Quelqu’un peut-il conseiller une meilleure méthode, mais avec la même vitesse de performance?

Pour une mémoire partagée simple, vous n’avez même pas besoin d’une bibliothèque spéciale:

class Main { private static class CustomThread extends Thread { public int x = 0; public void run() { x = 5; } } public static void main(Ssortingng[] args) { CustomThread t = new CustomThread(); t.start(); System.out.println(tx); System.out.println(tx); } } 

La variable locale x est accessible en dehors du thread et à l’intérieur, vous permettant de l’utiliser pour transmettre des informations dans et hors du thread.