Я часто слышу, что доступ к сегменту разделяемой памяти между процессами не имеет снижения производительности по сравнению с доступом к памяти процесса между потоками. Другими словами, многопоточное приложение не будет быстрее, чем набор процессов с использованием общей памяти (исключая блокировку или другие проблемы синхронизации).
Но у меня есть сомнения:
1) shmat() отображает локальную виртуальную память процесса в общий сегмент. Этот перевод должен выполняться для каждого адреса разделяемой памяти и может представлять значительную стоимость. В многопоточном приложении нет необходимости в дополнительном переводе: все адреса виртуальной машины преобразуются в физические адреса, как в обычном процессе, который не имеет доступа к общей памяти.
2) Сегмент разделяемой памяти должен каким-то образом поддерживаться ядром. Например, когда все процессы, подключенные к shm, сняты, сегмент shm все еще работает и может быть в конечном итоге повторно доступен вновь запущенными процессами. Могут быть некоторые накладные расходы, связанные с операциями ядра в сегменте shm.
Является ли многопользовательская система общей памяти так же быстро, как многопоточное приложение?