fork () e comportamento COW após exec ()

1

Entendemos o comportamento da VAC após uma bifurcação (como por exemplo descrito aqui ) da seguinte forma: fork cria uma cópia de a tabela de páginas dos pais para o filho e marca as páginas físicas somente como leitura, portanto, se qualquer um dos dois processos tentar escrevê-lo, ele acionará uma falha de página e copiará a página.

O que acontece depois dos executivos do processo filho? Supomos que o processo pai possa gravar novamente em suas páginas sem acionar uma falha de página, mas é difícil encontrar informações exatas sobre como isso é implementado.

Todos os ponteiros (incluindo o código) são bem-vindos!

    
por js84 16.09.2018 / 08:20

1 resposta

1

Quando o processo filho é executado, todas as suas páginas atuais são substituídas por um novo conjunto de páginas correspondente à nova imagem executável (mais heap, pilha, etc.).

Sistemas operacionais modernos implementam o CoW mantendo uma contagem de referência para as páginas físicas compartilhadas entre os processos pai e filho. Se uma página é compartilhada entre pai e filho, a contagem de referência será 2. Uma vez que o processo filho passa por exec, a contagem de referência para as páginas compartilhadas é decrementada (por exemplo, é de volta para 1), portanto, qualquer operação de gravação pelo processo pai terá sucesso sem CoW.

Para sua diversão, crie um programa simples que bifurque seguido pelo processo filho dormindo por alguns segundos e depois fazendo e exec. Agora observe o conteúdo de /proc/PID/smaps de ambos os processos antes de fork (somente pai, é claro), depois de fork antes de exec e depois de exec. Preste atenção nas páginas Shared_XXX e nos intervalos de endereços correspondentes.

Em termos de código, existem algumas extensões XV6 simples para suportar o copy-on-write. Uma simples pesquisa no google pode ser suficiente. Outro local para analisar pode ser o link . Comece a rastreá-lo a partir da entrada do garfo e divirta-se.

Fork is rather simple, once you get the hang of it, but the memory management can be a bitch. See 'mm/memory.c': 'copy_page_range()'

    
por 18.09.2018 / 07:20