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

PreviousClone de processo (forking)NextTodo processo tem uma thread principal

Last updated 5 months ago