разветвление в linux о COW

В Linux я знаю, что это реализовано COW из-за расточительства. Но в книге говорится, что когда ребенок вызывает exec() сразу после fork(), адресные пространства никогда не копируются. Но я думаю, что если ребенок использует exec(), это означает создание новых данных или кодов в адресном пространстве, которое еще не скопировано. Таким образом, когда вызывается exec(), адресное пространство копируется (копирование при записи), и сюда записываются новые данные или коды.

Я ошибся? Почему вызовы exec() никогда не копируют родительские вещи?

Или, если ребенок вызывает exec(), тогда ребенок просто создает свою собственную mm_struct и записывает новые данные в свое собственное адресное пространство, которое было создано заново? (не копируется из родителя)


person A.Cho    schedule 19.01.2016    source источник


Ответы (1)


exec — это библиотечная оболочка для вызова ядра execve. перед запуском execve произойдет некоторая активность стека (даже если execve вызывается напрямую), поэтому при записи будет скопирован как минимум один блок стека, прежде чем exec отключится от контекста процесса.

тем временем родительский процесс будет выполнять большое количество копий при записи, прежде чем дочерний процесс отключится.

person Jasen    schedule 19.01.2016