Вы можете думать об этом как о порождении потока в Windows, за исключением того, что процессы не делят ресурсы, кроме файловых дескрипторов, разделяемой памяти и других явных наследуемых вещей.Поэтому, если у вас есть новая задача, которую вы можете выполнить, вы можете выполнить ветвление, и один процесс продолжит выполнение своей первоначальной задачи, пока клон позаботится о новом назначении.
Если вы хотите выполнять параллельные вычисления, ваши процессы могут быть разделены на несколько клонов прямо над циклом.Каждый из клонов выполняет подмножество вычислений, пока родитель ожидает их завершения.Операционные системы гарантируют, что они могут работать параллельно.В Windows вам, например, нужно использовать OpenMP, чтобы получить такую же выразительность.
Если вам нужно читать или записывать из файла, но вы не можете ждать, вы можете просто разветвиться, и ваш клон сделает ввод / вывод, пока выпродолжить исходное заданиеВ Windows вы можете подумать о порождении потоков или использовании перекрывающегося ввода-вывода во многих ситуациях, когда в Unix подойдет простой форк.В частности, процессы не имеют таких проблем с масштабируемостью, как потоки.Это особенно верно для 32-битных систем.Просто разветвление гораздо удобнее, чем разбираться со сложностями перекрывающегося ввода-вывода.Хотя процессы имеют свое собственное пространство памяти, потоки живут в одном и том же, и, таким образом, существует ограничение на количество потоков, которые вы должны рассмотреть для добавления в 32-битный процесс.Создание 32-битного серверного приложения с помощью fork очень просто, а создание 32-битного серверного приложения с потоками может быть кошмаром.И поэтому, если вы программируете на 32-битной Windows, вам придется прибегнуть к другим решениям, таким как перекрывающийся ввод-вывод, с которым PITA работает.
Поскольку процессы не разделяют глобальные ресурсы, такие как потоки (например, глобальная блокировка в malloc) это гораздо более масштабируемо.Хотя потоки часто блокируют друг друга, процессы работают независимо.
В Unix, поскольку fork создает клон процесса копирования при записи, он не тяжелее, чем порождает новый поток в Windows.
Если вы имеете дело с интерпретируемыми языками, где обычно есть глобальная блокировка интерпретатора (Python, Ruby, PHP ...), операционная система, которая дает вам возможность форка, незаменима.В противном случае ваша способность эксплуатировать несколько процессоров будет гораздо более ограниченной.
Другое дело, что здесь есть проблема безопасности.Процессы не разделяют пространство памяти и не могут испортить внутренние детали друг друга.Это приводит к повышению стабильности.Если у вас есть сервер, который использует потоки, сбой в одном потоке уничтожит все приложение сервера.С разветвлением крушения снесет только раздвоенный клон.Это также упрощает обработку ошибок.Часто бывает достаточно, чтобы ваш разветвленный клон прервался, поскольку это не имеет значения для исходного приложения.
Существует также проблема безопасности.Если в раздвоенный процесс внедряется вредоносный код, он больше не может повлиять на родительский процесс.Современные веб-браузеры используют это, например, для защиты одной вкладки от другой.Все это гораздо удобнее для программирования, если у вас есть системный вызов fork.