O fork () copia imediatamente todo o heap do processo no Linux?

25

Uma fork() chamada do sistema clona um processo filho do processo em execução. Os dois processos são idênticos, exceto pelo seu PID.

Naturalmente, se os processos estão apenas lendo seus heaps ao invés de escrever para ele, copiar o heap seria um grande desperdício de memória.

O heap inteiro do processo é copiado? É otimizado de forma que somente a escrita aciona uma cópia de heap?

    
por Adam Matan 20.08.2014 / 16:58

3 respostas

14

A totalidade de fork() é implementada usando mmap / copy na gravação.

Isso não afeta apenas o heap, mas também as bibliotecas compartilhadas, pilha, áreas BSS.

O que, aliás, significa que fork é uma operação extremamente leve, até que os 2 processos resultantes (pai e filho) realmente começam a gravar nos intervalos de memória. Este recurso é um grande contribuidor para a letalidade de fork-bombs - você acaba com muitos processos antes que o kernel seja sobrecarregado com replicação e diferenciação de páginas.

Você terá dificuldade em encontrar em um sistema operacional moderno um exemplo de operação em que o kernel executa uma cópia impressa (sendo os drivers de dispositivos a exceção) - é muito mais fácil e eficiente empregar a funcionalidade da VM.

Mesmo execve() é essencialmente "por favor mmap o binário / ld.so / whatnot, seguido de executar" - e a VM manipula o carregamento real do processo para RAM e execução. As variáveis locais não inicializadas acabam sendo mmapadas de uma 'página zero' - página especial de copy-on-write de somente leitura contendo zeros, variáveis locais inicializadas acabam sendo mmaped (copy-on-write, novamente) do próprio arquivo binário, etc.

    
por 20.08.2014 / 17:17
18

O kernel do Linux implementa Copy-on-Write quando fork() é chamado. Quando o syscall é executado, as páginas compartilhadas pelo pai e pelo filho são marcadas como somente leitura.

Se uma gravação for executada na página somente leitura, ela será copiada, pois a memória não será mais idêntica entre os dois processos. Portanto, se apenas as operações de leitura estiverem sendo executadas, as páginas não serão copiadas.

    
por 20.08.2014 / 17:15
8

O Linux faz Copy-on-Write. Como fork cria um novo processo, as páginas alocadas são marcadas como somente leitura e compartilhadas entre pai e filho. Quando qualquer um deles tenta modificar uma página, uma falha de página é gerada, resultando na cópia da página e no ajuste adequado da tabela de páginas.

    
por 20.08.2014 / 17:14

Tags