Sua pergunta é parcialmente baseada em uma convenção de nomenclatura incorreta. Um "thread de controle" no kernel-speak é um processo no usuário. Então, quando você ler que vfork "o thread de chamada está suspenso", pense em "process" (ou "thread de alta gramatura" se quiser) e não "thread" como em "processo multi-threaded".
- Então, sim, o processo pai está suspenso.
vfork
foram definidas para o caso muito comum em que um processo (o shell na maioria das vezes) entraria, com alguns descritores de arquivo e, em seguida, exec
de outro processo. O pessoal do kernel percebeu que poderia economizar uma enorme quantidade de sobrecarga de cópia de página se ignorasse a cópia, já que o exec
iria simplesmente jogar fora essas páginas copiadas. Um vforked child tem sua própria tabela de descritores de arquivos no kernel, portanto, manipular isso não afeta o processo pai, mantendo a semântica de fork
inalterada.
- Por quê? Porque garfo / exec era comum, caro e desperdício
Dada a definição mais precisa de "thread de controle do kernel", a resposta para eles podem ser executados em paralelo é claramente
- Não, o pai será bloqueado pelo kernel até que o filho saia ou seja executado
Como os pais sabem que a criança saiu?
- Não, o kernel sabe e impede que o pai receba qualquer CPU até que a criança tenha ido embora.
Quanto à última questão, eu suspeitaria que o kernel detectaria as operações da pilha filho envolvidas em um retorno e sinalizaria a criança com um sinal não detectável ou apenas a mataria, mas não sei os detalhes.