Como o forking afeta o layout de memória de um processo?

5

Por favor, veja a figura a seguir, mostrando o layout da memória de um processo:

:

Quando alguém forks() e um novo task_struct são atribuídos, o que acontece com os endereços do processo? Em mais ou menos outras palavras: imagine que há um processo, então a imagem abaixo é válida. Agora suponha que eu faça um garfo. O que acontece?

    
por Dervin Thunk 10.02.2012 / 19:33

4 respostas

3

Após o fork, você tem duas cópias do mesmo programa. O kernel pode copiar todo o espaço de endereço ou copy-on-write . No último caso, as seções de texto e dados provavelmente serão sempre compartilhadas por ambos os processos, e a pilha será copiada SE o filho precisar modificá-la, e assim por diante.

    
por 10.02.2012 / 19:46
2

Quando um processo é bifurcado, o Linux faz uma cópia mínima e utiliza um método copy-on-write. Essa cópia na gravação significa que, se ambos os processos (pai e filho) estiverem fazendo leituras, eles lerão exatamente os mesmos blocos de memória. Uma vez que uma delas escreve nessa memória, ela é copiada e não é mais compartilhada.

Agora os programas não sabem que isso está acontecendo. Isso ocorre porque o kernel mantém uma tabela de páginas para cada processo. Quando o processo diz 'Eu quero acessar a memória 0xbeef', o kernel remapeia isso em um local real na memória física. Isso é necessário porque o programa armazenará esses endereços em variáveis, portanto, quando o programa for bifurcado, ele não saberá se ou onde os dados em sua memória são movidos para (todos os endereços armazenados nas variáveis devem continuar válidos). br> Isso também é o que permite que o swap funcione. O kernel pode pegar a memória física que contém os dados e armazená-los em um disco, mas o programa ainda referencia o endereço 0xbeef, e o kernel irá traduzir isso.

Assim, o mínimo absoluto que o kernel acaba copiando é a tabela de páginas que faz esse mapeamento de endereços e a estrutura da tarefa (abrange arquivos abertos, estado do processo, sinais pendentes, etc.).

    
por 11.02.2012 / 03:45
1

Como cada processo é atribuído a seu próprio espaço de endereço (" memória virtual "), os endereços provavelmente permanecerão os mesmos , mas referem-se a endereços de memória diferentes em uma tabela de conversão ( quando modificada ). Do ponto de vista do processo, nada acontece com os endereços que ele usa e vê.

    
por 10.02.2012 / 19:42
0

O espaço de endereço inteiro é clonado. Em outras palavras, essa figura descreve os dois processos após o fork. Depois disso, os processos divergem um do outro, pois cada um deles muda as coisas de maneiras diferentes.

    
por 10.02.2012 / 19:42

Tags