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

É 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:

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

Last updated