Я понимаю, что два из многих других вариантов межпроцессного взаимодействия могут быть:
- Общая память
- Розетки
На самом деле я видел эти два варианта, предлагаемые Intellij Idea для отладки Java-приложения. Я хочу знать, каковы плюсы и минусы каждого подхода.
Ответы:
Несколько преимуществ для каждого из головы. Обратите внимание, что некоторые из этих пунктов могут применяться не во всех случаях; это всего лишь общие наблюдения.
Розетки
Просто и контролируемо. При необходимости может быть расширен до сетевых сокетов с небольшими изменениями или без изменений. Модель программирования требует сериализации, что, в свою очередь, требует, чтобы вы думали о том, какие данные фактически передаются из A в B. Синхронизация обязательно встроена в механизм связи; никакой другой синхронизации не требуется.
Общая память
Не обязательно требует системного вызова (поэтому потенциально быстрее). Совместное использование не требует явной передачи данных - можно сделать доступными данные, которые получатель не получит (пропускная способность не должна расходоваться при передаче данных, которые получатель не будет использовать). Отсутствие этапа сериализации / десериализации означает отсутствие затрат времени на связь.
источник
Розетки один-к-одному. Вам нужно несколько сокетов, если вы хотите отправить одну и ту же вещь нескольким процессам. С общей памятью вы можете иметь несколько читателей, а также несколько писателей.
Розетки ресурсоемкие. Каждое сообщение проходит через ОС. Используя разделяемую память, вы отображаете разделяемую память, но один раз в память вашего приложения, и с этого момента вы можете ее использовать. Тем не менее, вам все равно нужно пройти через ОС, когда вы использовали общую память; см. ниже.
Сокеты синхронизируются (если вы не используете UDP). С разделяемой памятью вам почти неизбежно необходим какой-то дополнительный механизм, чтобы сообщать другим процессам, что чтение / запись в разделяемую память в порядке / не в порядке. Не делайте этого, и у вас возникнут проблемы с поврежденной памятью. Пример: Предположим, что процесс A начинает чтение разделяемой памяти чанка, но частично выгружается из чтения. Процесс B записывает в тот же кусок общей памяти. Когда процесс А перезапускается и продолжает читать разделяемую память, он прочитал путаницу старых и новых данных. Чтобы предотвратить это, вы все равно проходите через ОС, когда используете общую память.
Довольно просто преобразовать набор приложений на основе сокетов в тот, который использует сетевые сокеты. Вы можете распространить обработку на все машины в вашей лаборатории или даже дальше. просто не могу сделать это с общей памятью. Вы привязаны к одной машине с решением на основе общей памяти.
Сокеты предназначены для небольших объемов данных, разделяемая память - для больших объемов данных. Существуют разные механизмы для решения разных проблем.
источник