Зачем запускают процессы
Что проверяют
Понимаете ли вы разницу между процессом и потоком и когда отдельный процесс оправдан, несмотря на цену. Следом обычно спрашивают про fork в многопоточной программе, про межпроцессное взаимодействие или просят сравнить с std::thread.
Как отвечать
Процесс это программа в собственном адресном пространстве со своими дескрипторами, правами и лимитами. Отсюда причины его запускать:
- изоляция сбоев: падение или порча памяти в одном процессе не убивает остальные. Так браузеры держат вкладки в отдельных процессах рендеринга, а сервер выносит ненадёжный сторонний код или плагины;
- безопасность: процесс можно запустить с меньшими правами и в песочнице. Классика разделения привилегий это OpenSSH, где разбор сетевого ввода идёт в непривилегированном процессе;
- запуск другой программы:
fork+exec,posix_spawn, в WindowsCreateProcess. Компилятор, утилита, скрипт; - параллельные воркеры: master и worker в nginx, отдельный процесс на соединение в PostgreSQL. Упавший воркер перезапускается, не задевая соседей;
- ограничение ресурсов: лимиты памяти и CPU через
setrlimitили cgroups назначаются на процесс целиком; - борьба с утечками: воркер периодически перезапускают, и накопленная память возвращается системе.
Цена: создать процесс дороже, чем поток, хотя fork благодаря copy-on-write не копирует память сразу. Переключение между процессами меняет адресное пространство и бьёт по TLB. Данные между процессами ходят только через IPC: каналы, сокеты, разделяемая память (shm_open + mmap), очереди сообщений.
В стандартной библиотеке C++ API для процессов нет, только std::thread. Используют POSIX или WinAPI напрямую либо Boost.Process.
Где спотыкаются
После fork в многопоточной программе вызывают в дочернем процессе что угодно. Копируется только вызвавший поток, и мьютекс, захваченный другим потоком, остаётся запертым навсегда. До exec допустимы лишь async-signal-safe функции.
Забывают waitpid, и завершившиеся дочерние процессы висят зомби в таблице процессов.
Отвечают «процессы нужны для многозадачности» и не могут сказать, почему в конкретной задаче не хватило бы потоков.