Segundo a Wikipedia (o que pode estar errado)
Quando uma chamada do sistema fork () é emitida, uma cópia de todas as páginas correspondentes ao processo pai é criada, carregada em um local de memória separado pelo SO para o processo filho. Mas isso não é necessário em certos casos. Considere o caso em que um filho "
exec
" executa uma chamada do sistema (usada para executar qualquer arquivo executável de um programa C) ou sai logo após ofork()
. Quando o filho é necessário apenas para executar um comando para o processo pai, não há necessidade de copiar as páginas do processo pai, poisexec
substitui o espaço de endereço do processo que o invocou pelo comando a ser executado.Nesses casos, é utilizada uma técnica chamada cópia na gravação (COW). Com essa técnica, quando ocorre uma bifurcação, as páginas do processo pai não são copiadas para o processo filho. Em vez disso, as páginas são compartilhadas entre o filho e o processo pai. Sempre que um processo (pai ou filho) modifica uma página, é feita apenas uma cópia separada dessa página específica para o processo (pai ou filho) que executou a modificação. Esse processo usará a página recém-copiada em vez da compartilhada em todas as referências futuras. O outro processo (aquele que não modificou a página compartilhada) continua usando a cópia original da página (que agora não é mais compartilhada). Essa técnica é chamada de copiar na gravação, pois a página é copiada quando algum processo é gravado nela.
Parece que quando um dos processos tenta gravar na página, uma nova cópia da página é alocada e atribuída ao processo que gerou a falha da página. A página original é marcada como gravável posteriormente.
Minha pergunta é: o que acontece se a fork()
chamada é chamada várias vezes antes de qualquer um dos processos tentar gravar em uma página compartilhada?
pmap -XX PID
ou cat /proc/PID/smap
.