
Vamos encontrar algumas diferenças entre fork () e vfork () com a ajuda do gráfico de comparação mostrado abaixo.
Gráfico de comparação
Base para Comparação | garfo() | vfork () |
---|---|---|
Basic | O processo filho e o processo pai possuem espaços de endereço separados. | O processo filho e o processo pai compartilham o mesmo espaço de endereço. |
Execução | Processo pai e filho são executados simultaneamente. | O processo pai permanece suspenso até que o processo filho conclua sua execução. |
Modificação | Se o processo filho alterar qualquer página no espaço de endereço, ele será invisível para o processo pai, já que o espaço de endereço é separado. | Se o processo filho alterar qualquer página no espaço de endereço, ele ficará visível para o processo pai, já que eles compartilham o mesmo espaço de endereço. |
Cópia-on-write | fork () usa copy-on-write como uma alternativa em que o pai e o filho compartilham as mesmas páginas até que qualquer um deles modifique a página compartilhada. | vfork () não usa copy-on-write. |
Definição de garfo ()
O fork () é uma chamada de sistema usada para criar um novo processo . O novo processo criado pela chamada fork () é o processo filho, do processo que invocou a chamada do sistema fork (). O código do processo filho é idêntico ao código do processo pai. Após a criação do processo filho, o processo pai e filho inicia sua execução a partir da próxima instrução após fork () e ambos os processos são executados simultaneamente .
O processo pai e o processo filho possuem um espaço de endereço separado . Portanto, quando qualquer um dos processos modifica qualquer declaração ou variável no código. Não seria refletido em outros códigos de processo. Vamos supor que se o processo filho modificar o código, isso não afetaria o processo pai.
Algum processo filho após sua criação chama imediatamente exec () . A chamada do sistema exec () substitui o processo pelo programa especificado em seu parâmetro. Em seguida, o espaço de endereço separado do processo filho é inútil. A única alternativa aqui é copy-on-write.
O copy-on-write permite que o pai e o filho processem para compartilhar o mesmo espaço de endereço. Se qualquer um dos processos gravar nas páginas no espaço de endereço, a cópia do espaço de endereço será criada para permitir que o processo funcione independentemente.
Definição de vfork ()
A versão modificada de fork () é vfork (). A chamada do sistema vfork () também é usada para criar um novo processo. Semelhante ao fork (), aqui também o novo processo criado é o processo filho, do processo que invocou vfork (). O código do processo filho também é idêntico ao código do processo pai. Aqui, o processo filho suspende a execução do processo pai até concluir sua execução, pois o processo compartilha o mesmo espaço de endereço a ser usado.
Como o processo filho e pai compartilha o mesmo espaço de endereço . Se algum dos processos modificar o código, ele ficará visível para o outro processo que compartilha as mesmas páginas. Vamos supor que o processo pai altere o código; refletirá no código do processo infantil.
Como o uso de vfork () não cria espaços de endereçamento separados para processos pai e filho. Portanto, ele deve ser implementado onde o processo filho chama exec () imediatamente após sua criação. Portanto, não haverá desperdício de espaço de endereço, e é a maneira eficiente de criar um processo. O vfork não usa copy-on-write .
Principais diferenças entre fork () e vfork ()
- A principal diferença entre fork e vfork é que o processo filho criado pelo fork possui um espaço de memória separado do processo pai. No entanto, o processo filho criado pela chamada do sistema vfork compartilha o mesmo espaço de endereço de seu processo pai.
- O processo filho criado usando fork é executado simultaneamente com o processo pai. Por outro lado, o processo filho criado usando o vfork suspende a execução do processo pai até que sua execução seja concluída.
- Como o espaço de memória do processo pai e filho é uma modificação separada feita por qualquer um dos processos, isso não afeta as páginas dos outros. No entanto, como o processo pai e filho compartilha, a mesma modificação de endereço de memória feita por qualquer processo reflete no espaço de endereço.
- A chamada de sistema fork () usa copy-on-write como uma alternativa, que permite que o processo filho e pai compartilhem o mesmo espaço de endereço até que qualquer um deles modifique as páginas. Por outro lado, o vfork não usa copy-on-write.
Conclusão:
A chamada do sistema vfork () deve ser implementada quando a execução do processo filho executa exec () imediatamente após sua criação usando fork (). Como o espaço de endereço separado para o processo filho e pai não será de uso aqui.