Does the behavior of execve() depend on how the calling process was created?
Não.
Before seeing the quote, I thought that execve() would overwrite the old "stack, heap, and (initialized and uninitialized) data segments", instead of creating new ones.
Não: execve () cria novos segmentos e desaloca os antigos.
So when I saw the quote, wonder why waste the new space?
Tente lembrar, estamos falando de memória virtual!
A criação de um segmento em branco aloca apenas uma pequena quantidade de memória física para rastrear o segmento. O tamanho dessa alocação é fixo, não importa o tamanho do segmento.
Uma página física deve ser alocada para cada página em que você escreve. O processo pai pode ter escrito em um grande número de páginas. Mas se a criança usar apenas uma pequena pilha / pilha / dados quando for executada, não há uma boa razão para manter referências a todas as páginas sujas do pai! Isso desperdiçará memória se o pai sair e a criança continuar correndo.
Remover as referências aos segmentos antigos e às páginas antigas é a abordagem mais eficiente. Porque se essa fosse a única referência àquela memória, a memória física pode ser desalocada.