Подтвердить что ты не робот

Сокеты доменов UNIX vs Общая память (Mapped File)

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

  • должен читать и писать линейным способом.

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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