Каковы плюсы и минусы межпроцессного взаимодействия через сокеты и разделяемую память?

9

Я понимаю, что два из многих других вариантов межпроцессного взаимодействия могут быть:

  1. Общая память
  2. Розетки

На самом деле я видел эти два варианта, предлагаемые Intellij Idea для отладки Java-приложения. Я хочу знать, каковы плюсы и минусы каждого подхода.

Фанат
источник
Более новый метод - D-Bus.
ot--
@ ott-- Разве D-Bus сам не использует доменные сокеты Unix?
@BrianMarshall Действительно, доменные и tcp / ip сокеты.
ot--
Здесь также есть ответы: stackoverflow.com/a/1844919/632951
Pacerier

Ответы:

11

Несколько преимуществ для каждого из головы. Обратите внимание, что некоторые из этих пунктов могут применяться не во всех случаях; это всего лишь общие наблюдения.

Розетки

Просто и контролируемо. При необходимости может быть расширен до сетевых сокетов с небольшими изменениями или без изменений. Модель программирования требует сериализации, что, в свою очередь, требует, чтобы вы думали о том, какие данные фактически передаются из A в B. Синхронизация обязательно встроена в механизм связи; никакой другой синхронизации не требуется.

Общая память

Не обязательно требует системного вызова (поэтому потенциально быстрее). Совместное использование не требует явной передачи данных - можно сделать доступными данные, которые получатель не получит (пропускная способность не должна расходоваться при передаче данных, которые получатель не будет использовать). Отсутствие этапа сериализации / десериализации означает отсутствие затрат времени на связь.

tylerl
источник
4
+1: сокеты масштабируются до распределенных систем, тогда как разделяемая память намного быстрее.
Mouviciel
@tylerl Почему общая память не требует системного вызова?
Компьютерщик
@Geek: Узнайте, как управление виртуальной памятью реализовано в современных ОС. В основном, под капотом разделяемой памяти реализован практически идентичный процесс нормальной памяти. Просто так получилось, что одна и та же физическая страница специально отображена в 2 (или N) разных процессах. Но как только это сопоставление установлено, * px = 5 создает один и тот же набор инструкций независимо от того, указывает ли px на обычную переменную или указывает на сегмент общей памяти.
ДХМ
технически вам не нужно сериализовать данные через сокет, если получатель может принять необработанный поток байтов в формате, который вы отправляете. Большинство людей, очевидно, сериализуются, чтобы отправлять их кому угодно.
gbjbaanb
1
@gbjbaanb Я думаю, что технически вы сериализуете данные, если они передаются в виде последовательной строки битов, независимо от структуры кодирования.
Tylerl
6

Розетки один-к-одному. Вам нужно несколько сокетов, если вы хотите отправить одну и ту же вещь нескольким процессам. С общей памятью вы можете иметь несколько читателей, а также несколько писателей.

Розетки ресурсоемкие. Каждое сообщение проходит через ОС. Используя разделяемую память, вы отображаете разделяемую память, но один раз в память вашего приложения, и с этого момента вы можете ее использовать. Тем не менее, вам все равно нужно пройти через ОС, когда вы использовали общую память; см. ниже.

Сокеты синхронизируются (если вы не используете UDP). С разделяемой памятью вам почти неизбежно необходим какой-то дополнительный механизм, чтобы сообщать другим процессам, что чтение / запись в разделяемую память в порядке / не в порядке. Не делайте этого, и у вас возникнут проблемы с поврежденной памятью. Пример: Предположим, что процесс A начинает чтение разделяемой памяти чанка, но частично выгружается из чтения. Процесс B записывает в тот же кусок общей памяти. Когда процесс А перезапускается и продолжает читать разделяемую память, он прочитал путаницу старых и новых данных. Чтобы предотвратить это, вы все равно проходите через ОС, когда используете общую память.

Довольно просто преобразовать набор приложений на основе сокетов в тот, который использует сетевые сокеты. Вы можете распространить обработку на все машины в вашей лаборатории или даже дальше. просто не могу сделать это с общей памятью. Вы привязаны к одной машине с решением на основе общей памяти.

Сокеты предназначены для небольших объемов данных, разделяемая память - для больших объемов данных. Существуют разные механизмы для решения разных проблем.

Дэвид Хаммен
источник