Сокеты домена UNIX и общая память (сопоставленный файл) - PullRequest
45 голосов
/ 20 января 2010

Кто-нибудь может сказать, насколько медленны доменные сокеты UNIX по сравнению с Shared Memory (или альтернативным файлом, отображенным в память)?

Спасибо.

Ответы [ 4 ]

67 голосов
/ 20 января 2010

Это больше вопрос дизайна, чем скорость (общая память быстрее ), доменные сокеты, безусловно, больше в стиле UNIX и делают намного меньше проблем. С точки зрения выбора знаю заранее:

Преимущества доменных сокетов

  • блокирующий и неблокирующий режим и переключение между ними
  • вам не нужно освобождать их, когда задачи завершены

Недостатки доменных сокетов

  • должен читать и писать линейно

Преимущества общей памяти

  • Нелинейное хранилище
  • никогда не заблокирует
  • несколько программ могут получить к нему доступ

Недостатки общей памяти

  • нужна реализация блокировки
  • требуется ручное освобождение, даже если оно не используется какой-либо программой

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

11 голосов
/ 20 января 2010

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

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

4 голосов
/ 20 января 2010

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

0 голосов
/ 01 июня 2015

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

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

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