Есть ли общая память между разными процессами
Что проверяют
Понимаете ли вы изоляцию процессов в ОС и не путаете ли процессы с горутинами. Следом обычно спрашивают, как всё-таки организовать обмен через общую память и почему sync.Mutex тут не поможет.
Как отвечать
По умолчанию общей памяти нет: у каждого процесса своё виртуальное адресное пространство, и один и тот же адрес в двух процессах указывает на разные физические страницы. Общую память создают явно:
- POSIX shared memory:
shm_openсоздаёт объект (в Linux он виден в/dev/shm),mmapс флагомMAP_SHAREDотображает его в адресное пространство; - отображение файла: тот же
mmapсMAP_SHAREDна обычный файл, изменения видят все процессы, которые его отобразили; - System V:
shmgetиshmat, старый интерфейс, до сих пор встречается; - неявно: код разделяемых библиотек и страницы после
forkделят физическую память, пока кто-то не запишет (copy-on-write). Но это оптимизация ОС, а не канал обмена.
В Go это делается через syscall.Mmap или unix.Mmap из golang.org/x/sys/unix, результат приходит как []byte. Дальше важны три вещи. Синхронизация: sync.Mutex живёт в рантайме одного процесса, поэтому нужны атомики над общей областью, futex или внешняя блокировка вроде flock. Указатели: в общей памяти нельзя хранить Go-указатели, строки и слайсы, сборщик мусора эту область не видит, а адреса в другом процессе ничего не значат. Формат: данные кладут плоскими байтами фиксированной раскладки.
В реальных Go-сервисах к общей памяти прибегают редко: Unix-сокеты, пайпы и gRPC проще и почти всегда достаточно быстры.
Где спотыкаются
Отвечают про горутины: показывают структуру с мьютексом и sync.WaitGroup. Горутины живут в одном процессе и память делят всегда, вопрос о другом.
Считают, что sync.Mutex, положенный в общий сегмент, защитит данные в обоих процессах. Его состояние и очередь ожидания управляются рантаймом конкретного процесса.
Забывают про жизненный цикл: сегмент в /dev/shm переживает процесс, и без shm_unlink мусор копится до перезагрузки. Рядом ошибка с порядком памяти: запись без атомиков другой процесс может увидеть не в том порядке.