В чем преимущества и недостатки использования Socket в IPC - PullRequest
5 голосов
/ 16 февраля 2012

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

Любая помощь будет очень полезной.оценили.

Ответы [ 5 ]

6 голосов
/ 16 февраля 2012

По сравнению с конвейерами сокеты IPC отличаются двунаправленностью, то есть чтение и запись могут выполняться по одному и тому же дескриптору. Трубы, в отличие от розеток, являются однонаправленными. Вы должны сохранить пару дескрипторов, если хотите выполнять как чтение, так и запись.

Трубы, с другой стороны, гарантируют атомарность при чтении или записи с определенным количеством байтов. Запись чего-то меньшего, чем PIPE_BUF байтов за один раз гарантированно будет доставлена ​​одним чанком и никогда не будет выполняться частично. Сокеты требуют от программиста большего внимания в этом отношении.

Общая память, когда используется для IPC, требует явной синхронизации от программиста. Это может быть самый эффективный и самый гибкий механизм, но он требует более сложных затрат.

2 голосов
/ 17 февраля 2012

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

1 голос
/ 17 февраля 2012

Розетки дают вам несколько преимуществ ...

  • Вы можете подключить к ним простой клиент для тестирования (введите данные вручную, см. Ответ). Это очень полезно для отладки, симуляции и тестирования черного ящика.

  • Вы можете запускать процессы на разных машинах. Это может быть полезно для масштабируемости и очень полезно при отладке / тестировании, если вы работаете во встроенном программном обеспечении.

  • Становится очень легко представить ваш процесс как услугу

Но есть и недостатки

  • Накладные расходы больше, чем IPC, оптимизированный для одной машины. В частности, лучше использовать разделяемую память, если вам нужна производительность, и вы знаете, что все процессы находятся на одном компьютере.

  • Безопасность - если ваши клиентские приложения могут подключаться так же, как и все остальные, если вы не осторожны с аутентификацией. Данные также можно прослушивать, если вы не шифруете, и изменять, если вы, по крайней мере, не подписываете данные, передаваемые по проводной сети.

1 голос
/ 16 февраля 2012

Возможно, это слишком упрощенный ответ, но это важная деталь.Сокеты не поддерживаются во всех ОС.Недавно я узнал о проекте, который повсеместно использовал сокеты для IPC, и обнаружил, что их заставили перейти с Linux на проприетарную ОС, которая была POSIX, но не поддерживала сокеты так же, как Linux.

0 голосов
/ 16 февраля 2012

Использование настоящей очереди сообщений приводит к тому, что вы получаете сообщения фиксированного размера.Если у вас большое количество сообщений разного размера, это может стать проблемой производительности.Использование сокета может быть способом обойти это, хотя после этого вы пытаетесь обернуть эту функциональность так, чтобы она стала идентична очереди, что непросто получить в деталях, особенно такие аспекты, как блокирование / неблокирование и атомарность.1001 *

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

Очереди просты, но в моем обсуждении сокетов указаны недостатки как минусы.Благовесты ответят на этот вопрос.

Как и всегда, с такими вещами, я бы предложил прочитать книги У. Ричарда Стивенса по IPC и сокетам.Нет лучшего объяснения, чем его!: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...