Сокеты доменов UNIX vs Общая память (Mapped File)
Может ли кто-нибудь сказать, насколько медленными являются сокеты домена UNIX по сравнению с общей памятью (или альтернативным файлом с отображением памяти)?
Спасибо.
Ответы
Ответ 1
Это скорее вопрос дизайна, чем скорость (общая память быстрее), сокеты домена окончательно больше UNIX-стиля и делают намного меньше проблем. С точки зрения выбора заранее знайте:
Преимущества доменных сокетов
- блокирующий и неблокирующий режим и переключение между ними
- вам не нужно освобождать их, когда выполняются задачи.
Недостатки сокетов в домене
- должен читать и писать линейным способом.
Преимущества общей памяти
- Нелинейное хранилище
- никогда не блокирует
- несколько программ могут получить к нему доступ.
Недостатки общей памяти
- нужна реализация блокировки
- требуется ручное освобождение, даже если оно не используется какой-либо программой.
Это все, о чем я могу думать сейчас. Тем не менее, я бы пошел с сокетами домена в любой день - не говоря уже о том, что это намного проще, чем переопределить их для распределенных вычислений. Ускорение скорости общей памяти будет потеряно из-за необходимости безопасного дизайна. Однако, если вы точно знаете, что делаете, и используете правильные вызовы ядра, вы можете достичь большей скорости с общей памятью.
Ответ 2
С точки зрения скорости разделяемая память, безусловно, является победителем. С сокетами у вас будет как минимум две копии данных - от отправки процесса до буфера ядра, а затем от ядра к процессу получения. В общей памяти задержка будет привязана только алгоритмом согласованности кеша между ядрами на ящике.
Как отмечает Kornel, использование общей памяти более активно, поскольку вам нужно разработать собственную схему синхронизации/сигнализации, которая может добавить задержку в зависимости от того, какой маршрут вы собираетесь. Определенно использовать семафоры в общей памяти (реализованные с помощью futex в Linux), чтобы избежать системных вызовов в неподтвержденном случае.
Ответ 3
Оба являются механизмами взаимодействия между процессами (IPC).
Сокеты домена UNIX используются для связи между процессами на одном хосте, подобно TCP-сокетам, используемым между разными хостами.
Общая память (SHM) - это часть памяти, где вы можете помещать данные и делиться ими между процессами.
SHM предоставляет вам произвольный доступ с помощью указателей, сокеты могут быть записаны или прочитаны, но вы не можете перемотать или сделать позиционирование.
Ответ 4
В этом случае - сокеты быстрее. Запись в общую память выполняется быстрее, чем любой IPC, но запись в файл с отображением памяти и запись в общую память - это две совершенно разные вещи.
при записи в файл с отображением памяти вам необходимо "сбросить" то, что было записано в разделяемую память, в фактический связанный файл (не совсем, флеш для вас делается), поэтому сначала вы копируете свои данные в общий память, а затем вы копируете ее снова (на флеш) в фактический файл, и это супер-пупер экспансивный - более того, что угодно, даже больше, чем запись в сокет, вы ничего не получаете, делая это.