# 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?**


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://concorrencia101.leandronsp.com/parte-i-concorrencia-no-sistema-operacional/clone-leve-de-processo-thread.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
