o que significa 'fork ()' copiará o espaço de endereço do processo original

6

Estou estudando 'conceitos do sistema de operação' por conta própria e estou estudando o chp3. parte do processo.

Existe um exemplo em que a função 'fork ()' é chamada e depende do valor do pid retornado, como o seguinte:

pid=fork();
if(pid<0){ //error stuff
}
else if(pid==0){
// child process stuff
}
else{
// parent process stuff
}

O que me confundiu aqui é que, se esse código for executado, entre os três cenários de 'if', apenas um seria executado, o que significa que apenas um dos procedimentos pai / filho seria executado.

Mas lendo um pouco mais cuidadosamente, encontrei uma frase que me ajudou a resolver a confusão, mas não inteiramente.

The new process consists of a copy of the address space of the original process.

Da minha imaginação, eu acho que isso significa que sempre que as chamadas 'fork ()' são executadas, de alguma forma uma cópia exata deste código será duplicada e será executada como processo 'filho' quando o código c original será executado como 'pai'.

Estou entendendo isso corretamente?

Além disso, o que o "espaço de endereço" tem a ver com isso? Novamente, usando minha imaginação, presumo que, uma vez que a execução do código pai significa que o código é carregado na RAM e executado onde terá um segmento de RAM atribuído ao código, esse segmento será copiado para um novo segmento em outro lugar localizado na RAM e ser atribuído para o processo filho.

O meu entendimento está correto?

    
por kwagjj 06.06.2015 / 10:31

1 resposta

6

Sim, você está correto.

Em particular, isso significa que o filho herdará todas as variáveis do processo pai com o valor que elas tinham no momento do fork. No entanto, se em uma etapa posterior um dos pais ou o filho modificar uma dessas variáveis, a modificação será local para esse processo: se o filho modificar uma variável, o processo pai ainda verá o valor antigo e não o novo .

Com os garfos, se você quiser que o processo pai e filho se comunique, será necessário usar alguma comunicação explícita entre processos.

Esta é a diferença com os threads. Conceitualmente, os forks e threads são os mesmos: o mesmo código sendo executado por dois processos no caso de forks e dois threads no caso de threads. No entanto, no caso de encadeamentos, o espaço de endereçamento não será copiado : os dois encadeamentos compartilharão a mesma memória, portanto, se um encadeamento modificar uma variável, isso afetará todos os outros encadeamentos.

Os threads, portanto, permitem uma comunicação muito flexível entre os threads, mas isso também é muito propenso a erros, devido à alta probabilidade de condições de corrida, se não for usado com cuidado.

Ambos os sistemas atendem necessidades diferentes. Como uma nota lateral, a primitiva fork geralmente é implementada de uma maneira inteligente no lado do sistema, já que o espaço de endereço não será copiado fisicamente, mas o sistema usará um sistema copy-on-write: os dados serão duplicados somente se um dos os processos tentam modificá-lo. Embora os dados não sejam modificados, eles não serão duplicados e, portanto, não consumirão mais memória.

Mais informações sobre garfos e segmentos podem ser encontradas em StackOverflow .

    
por 06.06.2015 / 11:15