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


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. Синхронизация обязательно встроена в механизм связи; никакой другой синхронизации не требуется.

Общая память

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


4
+1: сокеты масштабируются до распределенных систем, тогда как разделяемая память намного быстрее.
— Mouviciel

@tylerl Почему общая память не требует системного вызова?
— Компьютерщик

@Geek: Узнайте, как управление виртуальной памятью реализовано в современных ОС. В основном, под капотом разделяемой памяти реализован практически идентичный процесс нормальной памяти. Просто так получилось, что одна и та же физическая страница специально отображена в 2 (или N) разных процессах. Но как только это сопоставление установлено, * px = 5 создает один и тот же набор инструкций независимо от того, указывает ли px на обычную переменную или указывает на сегмент общей памяти.
— ДХМ

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

1
@gbjbaanb Я думаю, что технически вы сериализуете данные, если они передаются в виде последовательной строки битов, независимо от структуры кодирования.
— Tylerl

6

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.