O que acontece com os segmentos de dados antigos stack, heap e (initialized e uninitialized) após a chamada execve ()?

1

Manpage de execve () diz

execve() executes the program pointed to by filename. This causes the program that is currently being run by the calling process to be replaced with a new program, with newly initialized stack, heap, and (initialized and uninitialized) data segments.

Caso o processo de chamada tenha sido criado por vfork (), ele significa que exec () fornece um novo espaço de endereço para o novo programa; ele não modifica o espaço de endereço pai. .

Se o processo de chamada foi criado mais geralmente por fork (), o que normalmente acontece com os segmentos de dados "pilha, heap e (inicializado e não inicializado)" antigos? Os espaços deles são desalocados?

O comportamento de execve () depende de como o processo de chamada foi criado?

Antes de ver a citação, pensei que execve () sobrescreveria os antigos "pilha, pilha e (inicializado e não inicializado) segmentos de dados", em vez de criar novos. Então, quando vi a citação, me pergunto por que desperdiçar o novo espaço?

Obrigado.

    
por Tim 15.10.2018 / 21:57

1 resposta

2

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.

    
por 15.10.2018 / 22:36