Aula 6: fork() — Criando um Processo Filho
fork() é a syscall que dobra o número de processos: ela cria uma cópia exata do processo atual. Entender fork() é essencial para todo engenheiro de sistemas — o nvidia-docker e o alocador de GPU do Slurm o usam para criar ambientes isolados para cada job de GPU. Quando algo dá errado com processos d
fork() é como fotocopiar todo o conteúdo do seu cérebro e colocá-lo em outro corpo — de repente existem duas pessoas que se lembram de tudo até o momento da cópia. A única diferença é que uma tnum número de ID diferente da outra.
- fork()
- Uma syscall que cria um processo filho que é uma cópia do processo pai. fork() retorna 0 para o filho, o PID do filho para o pai, e -1 se falhar.
- Copy-on-Write (COW)
- Uma otimização do fork(): o kernel não copia fisicamente toda a memória imediatamente. Páginas de memória são partilhadas com o pai até que um dos dois escreva — e então só essa página é copiada.
- Processo Filho
- Um processo criado por fork(). O filho recebe um PID novo, mas seu PPID é o PID do pai. O filho tnuma cópia independente do espaço de endereçamento.
- getpid() / getppid()
- Syscalls que retornam o PID do processo atual e o PID do seu pai, respectivamente. Úteis depois do fork() para distinguir pai de filho.
- Duplicação do Espaço de Endereçamento
- fork() cria para o filho um espaço de endereçamento virtual independente com os mesmos endereços do pai. Mudar uma variável no filho não afeta o pai e vice-versa (graças ao Copy-on-Write).