Почему fork () работает именно так

Итак, я использовал fork () , и я знаю, что он делает. Я как новичок очень этого боялся (и до сих пор не понимаю полностью). Общее описание fork () , которое вы можете найти в Интернете, заключается в том, что он копирует текущий процесс и назначает другой PID, родительский PID и процесс будет иметь другое адресное пространство.Однако все хорошо, учитывая это описание функциональности, новичок может задаться вопросом: «Почему эта функция так важна ... зачем мне копировать свой процесс?». Так что я задался вопросом и в конце концов выяснил, как можно вызывать другие процессы из текущего процесса с помощью семейства execve () .

Я до сих пор не понимаю, почему вы должны делать это именно так? Самым логичным было бы иметь функцию, которую вы можете вызывать, например

create_process("executable_path+name",params..., more params); 

, которая порождает новый процесс и запускает его в начале main () и возвращает новый PID.

Меня беспокоит ощущение, что решение fork / execve выполняет потенциально ненужную работу. Что, если мой процесс использует тонны памяти? Копирует ли ядро ​​мои таблицы страниц и тому подобное. Я уверен, что он действительно не выделяет реальную память, если я не коснулся ее. Кроме того, что произойдет, если у меня есть потоки? Мне просто кажется, что это слишком грязно.

Почти все описания того, что делает fork, говорят, что он просто копирует процесс, и новый процесс запускается после вызова fork () . Это действительно то, что происходит, но почему это происходит именно так и почему fork / execve - единственный способ порождать новые процессы, и каков наиболее общий способ unix для создания нового процесса из вашего текущего? Есть ли другой более эффективный способ вызвать процесс? **, который не потребовал бы копирования дополнительной памяти.

В этой ветке обсуждается та же проблема, но я нашел ее не совсем удовлетворительной:

Спасибо.

33
задан Community 23 May 2017 в 12:09
поделиться