concorrencia101
  • Introdução
  • First things first
  • Agradecimentos
  • Parte I - Concorrência no sistema operacional
    • O que é o programa no sistema operacional
    • Escalonador preemptivo de tarefas
    • Uma nota sobre escalonamento cooperativo
    • Propriedades de um processo
    • Clone de processo (forking)
    • Clone leve de processo (thread)
    • Todo processo tem uma thread principal
    • Uma nota sobre paralelismo
    • Principais desafios em cenário de concorrência
      • Race condition
      • Sincronização com locks
      • Modelo de atores
    • E o I/O?
      • Latência de CPU vs Latência de I/O
      • Chamadas bloqueantes
      • Chamadas não-bloqueantes
      • Assincronismo e escalonamento cooperativo
    • Vamos colocar em prática...
  • PARTE II - Concorrência em diferentes linguagens
    • Definindo ambientes de execução
    • Concorrência em C
      • Forking de processos
      • Threads
      • Race condition e sincronização de threads com mutex
      • Desafios com o uso de threads
      • Thread Pool em C
      • Green threads
      • Modelo de Atores
      • Trabalhando com I/O
    • Concorrência em Ruby
      • Forking de processos
      • Threads
      • Race condition, YARV, GVL e paralelismo em Ruby
      • Modelo de Atores
      • Trabalhando com I/O
Powered by GitBook
On this page
  1. Parte I - Concorrência no sistema operacional

Clone de processo (forking)

PreviousPropriedades de um processoNextClone leve de processo (thread)

Last updated 5 months ago

A syscall **clone** sendo chamada sem argumentos, permite criar um outro processo filho exatamente igual, mas como processos são isolados, então todos os dados e programa seriam copiados para outra área da memória. Desta forma, poderíamos ter várias réplicas (filhos) do programa (pai) de modo a atender a uma demanda de acessos.

Esta técnica é chamada também de forking de processos.

Entretanto, forking pode fazer com que o uso de memória do computador atinja o limite máximo mais depressa, pois cada fork (filho) vai ter uma cópia exata do processo original (pai).

Forking é uma técnica bastante utilizada, principalmente em cenários de escalabilidade que demandam o cenário que foi trazido de aumento do número de requisições no sistema.

Eu disse que não ia citar a palavra escalabilidade mas é natural falar de escalabilidade quando estamos falando de concorrência. Por isso não vejo este termo como algo "complexo". Uma vez entendendo sobre concorrência de verdade, fica mais fácil resolver problemas de escalabilidade

E sim, eu posso futuramente escrever um outro guia falando só sobre escalabilidade de sistemas, mas vai ser inevitável falar de concorrência. Bem, você entendeu...

Okay, e se eu te disser que ao invés de clonar todos os dados do programa (processo), eu quiser clonar apenas uma parte dele, fazendo com que esta parte seja mais leve e tenha acesso compartilhado com a memória do processo principal?

O sistema operacional oferece este recurso?

Bem, para nossa sorte sim. A mesma chamada clone, se receber alguns argumentos específicos, faz exatamente isso que queremos: um "processo filho" mais leve que compartilha a memória do processo principal com outros processos "irmãos".

A este processo "leve" damos o nome de thread.

Não precisa se assustar e apegar a detalhes técnicos que vêm a seguir, pois quero apenas elucidar estas estruturas primitivas no sistema operacional