Fork()
fork ( int pid = fork() )
1- Verifica se há lugar na Tabela de Processos
2- Tenta alocar memória para o filho
3- Altera o mapa de memória e copia para a Tabela
4- Copia a imagem do Pai para o Filho
5- Copia para a tabela de processos a informação do processo Pai(pid,propriedades,estado,etc)
6- Atribui um Pid ao Pai
7- Informa o Kernel (Núcleo do Sistema Operativo) e o sistema de ficheiros que foi criado um novo processo
Exit()
exit (exit(int estado) )
O funcionamento depende do pai estar á espera ou não.
* Se o pai esta á espera, então a entrada na tabela é limpa e o espaço de memória é desalocado(o processo termina definitivamente)
* Se o pai não está á espera, o processo fica adormecido, activando um bit na entrada correspondente da tabela, o scheduler(o responsável pelo escalonamento dos processos) recebe uma mensagem de modo a evitar o processo
* Se o processo pai morre antes do filho fazer exit e de modo a evitar que o processo fique adormecido eternamente, este é adoptado pelo processo ttv(processo que "lê" o login) correspondente, já que este está a sempre a fazer wait
wait()
wait (int pid=wait(int *estado) )
Obriga o processo a esperar pelo fim de um filho de modo a libertar o espaço correspondente na tabela e originar uma eliminação definitiva.
- Obriga a uma pesquisa da tabela de processos, para descobrir se existe algum processo filho;
- Se existir um processo filho adormecido, ele é limpo da tabela de processos e o seu pid é retornado para o wait, assim como o argumento do exit do processo adormecido;
- Se não houver nenhum filho adormecido, e existir algum filho no scheduler, então o processo é bloqueado até o filho executar o exit;
- Se não existir nenhum filho na tabela de processos, o wait retorna um valor de erro.
Sem comentários:
Enviar um comentário