Страницы

Поиск по вопросам

вторник, 26 ноября 2019 г.

Зачем в POSIX-системах вызов fork() создаёт полную копию?


Изучая операционные системы задал себе вопрос: зачем в POSIX-подобных системах пр
создании процесса избран путь полного копирования родительского процесса в дочерни
и только после этого с помощью сис.вызова execve новый процесс перезаписывается полезны
содержимым? В чем смысл передавать дочернему весь образ памяти, строки конфигурации и т.д., когда, к примеру, в Windows создаётся, ну очень грубо говоря, "пустое ничего" и уже ему задаются аргументы, в поле памяти записывается выполняющаяся программа и ещё 7-8 стандартных параметров?

Вопрос иерархий тоже не затрагиваю, тут с этим все однозначно и польза от подход
ясна. У меня нет цели захейтить один из путей или развести холивар, мне хочется разобраться
какие плюсы и минусы у обоих способов. Ведь не просто так 'fork'у не нашли замены в течении нескольких десятилетий, так ведь? Да, я знаю, что большинство современных POSIX систем при вызове fork() используют COW принцип, но раньше ведь было не так.

Спасибо тем, кто постарается простым (а можно и не простым) языком описать суть на столько разных подходов. Принимаются любые ссылки с описанием.
    


Ответы

Ответ 1



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

Ответ 2



Я думаю, что суть fork в минимизации усилий программиста (обратите внимание, программиста а не железа) при создании нового процесса, окружение которого уже подготовлено всей историей жизни родителя (и остальных предков). Вам остается только добавить что-то свое (впрочем, ничто не мешает и отбросить это груз). Причем, делаете это безопасно для родителя, не оказывая воздействия на других его потомков. В простейшем случае вы можете даже не менять исполняемую программу, но в большинств случаев все же почти сразу делаете это (вызываете exec). Но и в этом случае fork очевидно полезен, позволяя изолировать какую-то подготовку к такой перемене уже в новом процессе. Да что тут много говорить, лучше почитайте The Evolution of the Unix Time-sharing System. В общем, fork это просто очень красивая концепция.

Комментариев нет:

Отправить комментарий