> For the complete documentation index, see [llms.txt](https://concorrencia101.leandronsp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://concorrencia101.leandronsp.com/parte-i-concorrencia-no-sistema-operacional/clone-leve-de-processo-thread.md).

# Clone leve de processo (thread)

Vamos viajar aqui, como seria a chamada `clone` no sistema operacional, com pseudo-código:

```
int clone() {
   // forking de processo, sem argumentos
   // vai criar um outro processo filho copiando tudo o que está na memória
   // para outra região da memória
}

// Mas para criar um processo mais "leve"

int clone(**args) {
   // recebe os argumentos específicos e cria o processo filho mais leve
   // ou seja, cria uma THREAD :)
}
```

Para criar um processo mais leve, ou seja uma **thread**, seria então necessário passar os seguintes argumentos para a chamada `clone`:

* **CLONE\_VM**: processo principal e processo filho compartilham o mesmo espaço de memória virtual
* **CLONE\_FS**: processos compartilham o mesmo sistema de arquivos
* **CLONE\_FILES**: processos compartilham a mesma tabela de descritor de arquivos (file descriptor table)
* **CLONE\_SIGHAND**: processos compartilham a mesma tabela de handlers de sinais (signal handlers)
* **CLONE\_PARENT**: processos compartilham o mesmo parent, ou seja, o processo "filho" na verdade é filho do processo parent do processo original (mesmo porque estamos falando de uma thread que compartilha o mesmo processo)
* **CLONE\_THREAD**: o processo filho é colocado no mesmo grupo de threads do processo original
* **CLONE\_IO**: processos compartilham o mesmo contexto de I/O

<figure><img src="/files/U1gYKm9yZ4BHCvGSMeYr" alt="" width="563"><figcaption></figcaption></figure>

É isto, caros leitores, uma thread é uma "parte" de um processo, mais leve e que compartilha a memória do processo com outras threads.

Como o sistema operacional é nosso amigo, ele trata as threads como **unidades de concorrência**, assim como os processos, portanto diferentes partes (threads) de um programa podem ser executadas de forma concorrente no sistema, assim como diferentes processos:

<figure><img src="/files/VRBZk2Tw7WoHOA69LUcJ" alt=""><figcaption></figcaption></figure>

Repare como que o escalonador fica *intercalando* tanto processos, quanto threads na CPU. **Que dia lindo, não?**
