Хорошая альтернатива IPC с общей памятью для приложений Java / C ++ в Linux - PullRequest
10 голосов
/ 24 мая 2009

В настоящее время я использую разделяемую память для IPC между приложениями Java и C ++, но ищу более удобную альтернативу.

Может кто-нибудь посоветовать лучший метод с той же производительностью и скоростью?

Спасибо!

Ответы [ 5 ]

7 голосов
/ 24 мая 2009

Это зависит от того, как вы планируете взаимодействовать с вашими приложениями. В среде POSIX у вас есть каналы, общая память, сокеты, семафоры и очереди сообщений. См. Этот вопрос: Сравнение unix linux IPC для получения дополнительной информации.

Какова модель взаимодействия для ваших процессов (т. Е. Клиент / сервер, производитель-потребитель и т. Д.)?

Исходя из личного опыта, я бы посоветовал вам лучше всего выбирать каналы (поскольку это просто файлы для чтения и записи байтов) или сокеты (так как оба языка поддерживают их).

4 голосов
/ 24 мая 2009

Как сказал Микелонг, это во многом зависит от того, что вы делаете. AFAIK, ни один из методов IPC не имеет собственных привязок Java, поэтому вам, вероятно, придется использовать JNI и создавать привязки самостоятельно, поэтому все различные методы примерно одинаково сложны. Если вы делаете передачу сообщений, я настоятельно рекомендую использовать очереди сообщений. Они очень просты в использовании (если у вас есть привязки) и имеют хорошую производительность. Если вам нужно «поделиться» каким-то ресурсом, то вы, вероятно, захотите использовать общую память.

Поскольку у вас что-то вроде клиента / сервера, я бы сказал, используйте очереди сообщений, доменные сокеты Unix или именованные каналы. Все они связаны с копированием данных в ядре, поэтому они работают не так быстро, как разделяемая память, но они все еще очень быстры. Если у вас есть данные, похожие на сообщения (отдельные небольшие пакеты), используйте очереди сообщений. Это, наверное, самое чистое решение. Если у вас больше потока данных, используйте каналы или сокеты. Преимущество сокетов состоит в том, что вы можете легко сделать их прозрачными для сети (например, X11) позже, если хотите, но с ними немного сложнее работать, чем с каналами. Производительность, вероятно, очень похожа.

0 голосов
/ 10 апреля 2012

В настоящее время я использую разделяемую память для IPC между приложениями Java и C ++, но ищу более удобную альтернативу.

Может кто-нибудь посоветовать лучший метод, но с такой же скоростью работы?

Для простой разделяемой памяти вам даже не нужна специальная библиотека:

class Main {
    private static class CustomThread extends Thread {
        public int x = 0;
        public void run() {
            x = 5;
        }
    }

    public static void main(String[] args) {

        CustomThread t = new CustomThread();
        t.start();

        System.out.println(t.x);
        System.out.println(t.x);
    }
}

Доступ к локальной переменной x возможен вне потока и внутри него, что позволяет вам использовать его для передачи информации в поток и из потока.

0 голосов
/ 27 мая 2009

Самый простой способ связи между приложениями, написанными на разных языках, это IMHO CORBA . Существует очень хороший открытый код CORBA ORBs . Мы используем TAO для C ++ и JacORB для Java. Есть также такие компании, как OCI и Remedy , которые предоставляют техническую поддержку.

0 голосов
/ 25 мая 2009

Хотя, вероятно, не самый эффективный, Java поддерживает только сокеты из коробки (лучшее, что я помню). Они очень гибкие, но, возможно, не так быстро, как другие варианты. Как упоминал Zifre, это дает вам возможность для прозрачности сети, а также прозрачности языка / связывания; так как почти каждый язык поддерживает библиотеку сокетов прямо из коробки в наши дни.

Хотя я выкидываю эффективность из окна, если вы хотите поднять ее на следующий уровень, вы, вероятно, можете обернуть это в какой-нибудь веб-сервис. Используйте встроенный веб-сервер на стороне потребителя, чтобы производители могли отправлять свои данные.

...