Зачем в POSIX-системах вызов fork() создаёт полную копию?
1,00
р.
р.
Изучая операционные системы задал себе вопрос: зачем в POSIX-подобных системах при создании процесса избран путь полного копирования родительского процесса в дочерний и только после этого с помощью сис.вызова execve новый процесс перезаписывается полезным содержимым? В чем смысл передавать дочернему весь образ памяти, строки конфигурации и т.д., когда, к примеру, в Windows создаётся, ну очень грубо говоря, "пустое ничего" и уже ему задаются аргументы, в поле памяти записывается выполняющаяся программа и ещё 7-8 стандартных параметров? Вопрос иерархий тоже не затрагиваю, тут с этим все однозначно и польза от подхода ясна. У меня нет цели захейтить один из путей или развести холивар, мне хочется разобраться, какие плюсы и минусы у обоих способов. Ведь не просто так 'fork'у не нашли замены в течении нескольких десятилетий, так ведь? Да, я знаю, что большинство современных POSIX систем при вызове fork() используют COW принцип, но раньше ведь было не так. Спасибо тем, кто постарается простым (а можно и не простым) языком описать суть на столько разных подходов. Принимаются любые ссылки с описанием.
Ответ Благодаря наводке кемментатора был найден англоязычный ресурс с идентичным вопросом. В комментариях найден ответ, который по моему мнению, более всего соответствует действительности. Итак: Существует две философии создания процесса: fork с наследованием содержимого родителя и создание пустого процесса с заданием аргументов (create). Очевидно, Unix использует fork. (Например, OSE и VMS используют метод create.) Unix имеет много наследуемых характеристик процесса. Через наследование эти характеристики могут быть добавлены новому процессу без измененя существующих программ. Используя модель create-with-arguments, добавление новых характеристик будет означать добавление новых аргументов в вызов create. Модель Unix проще. Имея вышеописанное существует возможность иметь также очень полезную модель fork-without-exec, где процесс может разбиться на несколько частей. Это было особо важно, когда не было никакой формы асинхронного ввода-вывода, и полезно, когда вы используете несколько процессоров в системе. По сути, это позволяет контейнеризировать несколько «программ» в одну программу, поэтому нет места для рассогласования или несоответствий версий и т.д. Модель fork / exec также дает возможность определенному дочернему процессу наследовать среду, настроенную между разветвлённым процессом и exec. Особенно, такие вещи, как унаследованные файловые дескрипторы. Модель создания (create model) не дает возможности наследовать все, что не было предусмотрено создателями вызова create. Некоторые системы также могут поддерживать динамическую компиляцию собственного кода, где процесс фактически создает собственную программу с собственным кодом. Другими словами, он хочет, чтобы новая программа записывала себя «на лету», без необходимости проходить цикл исходного кода / компилятора / компоновщика и занимать дисковое пространство. Модель fork поддерживает это, модель создания обычно нет.