Como Funciona a Criação de Processos
Os processos pai criam processos filhos, que, por sua vez, criam outros processos, formando uma árvore de processos.
Durante a execução, pai e filhos são executados concorrentemente, porém o pai espera até que os filhos terminem suas execuções.
Um ponto interessante a se observar é que quando o processo pai gera um processo filho, na verdade o processo filho é exatamente a cópia do processo pai, porém o filho pode ou não carregar um novo programa nele para que tenha outro conteúdo.
Nos sistemas Unix, as chamadas de sistema (system-call)
- fork cria novo processo (processo filho)
- exec que é usada após o fork substitui o espaço de memória do processo por um novo programa
- wait faz com que o processo pai permaneça bloqueado até seus filhos terminarem suas execuções.
Quando um processo é criado, um novo bloco de controle de processo (PCB) é criado para o processo.
Quando o fork é executado, o sistema copia o processo corrente e o executa. O valor de retorno de todo processo filho é ’0′ (zero), enquanto do processo pai é retornado o identificador (process identification – pid) do processo filho. Normalmente usamos o valor de retorno para identificarmos se o processo que está executando é o pai ou o filho.
Quando o fork é executado, o sistema copia o processo corrente e o executa. O valor de retorno de todo processo filho é ’0′ (zero), enquanto do processo pai é retornado o identificador (process identification – pid) do processo filho. Normalmente usamos o valor de retorno para identificarmos se o processo que está executando é o pai ou o filho.
Colocando a Mão na Massa
Para testarmos os conceitos acima ditos, vamos para mais um programinha em C:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
if(fork() == 0) {
printf(“Eu sou o filho\n”);
} else {
printf(“Eu sou o pai\n”);
}
}
Para compilarmos o arquivo:
gcc -o ProcessosPaiFilho ProcessosPaiFilho.c
E para executarmos:
./ProcessosPaiFilho
Repare que nossa saída foi:
Eu sou o pai
Eu sou o filho
Eu sou o filho
Explicando o conteúdo do programa acima, podemos reparar o seguinte:
Quando no primeiro ‘if’ chamamos a função fork(), é gerado e processado um novo processo filho e que é cópia deste mesmo programa. Ambos são executados em paralelo. No processo filho, que o retorno da função fork() é comparado com zero (como vimos nos conceitos anteriores, o processo filho retorna zero no fork()), será impresso na tela “Eu sou o filho”. No processo pai, o bloco ‘else’ será executado, imprimindo na tela “Eu sou o pai”.
Conclusão
Vimos mais um passo de como funcionam os processos no sistema operacional com base Unix. Vamos continuar avançando e publicando evidências dos estudos!
Nenhum comentário:
Postar um comentário