# 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="https://1347906346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FADWkcUWoXJQdqxwxxE7z%2Fuploads%2FyhD70uk4EbMDUtBwlV3F%2FScreenshot%202024-11-28%20at%2023.57.27.png?alt=media&#x26;token=2a0edbf8-29b5-4907-a0e1-ad983631cde7" 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="https://1347906346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FADWkcUWoXJQdqxwxxE7z%2Fuploads%2F2bjjFs4pz1Z6NontLgOa%2FScreenshot%202024-11-28%20at%2023.49.55.png?alt=media&#x26;token=e3efec32-9e83-4e3d-8dbd-aed2ca5f37e6" alt=""><figcaption></figcaption></figure>

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