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

Todo processo tem uma thread principal

Outra coisa para termos em mente, e que é muito importante, é o fato de que cada processo incorpora uma thread principal, chamada de main thread. Ou seja, quando o processo está em execução, lhe é atribuído um ID de thread (TID) que ocorre de ser o mesmo ID do processo (PID):

$ ps -eo pid,tid,cmd | grep system | head -n 5
	PID     TID CMD
    387     387 /lib/systemd/systemd-journald
    428     428 /lib/systemd/systemd-udevd
    536     536 /lib/systemd/systemd-timesyncd
    584     584 /lib/systemd/systemd-networkd
    586     586 /lib/systemd/systemd-resolved

Repare, que desta forma, fica mais prático para o sistema operacional tratar tudo como "thread", no fim das contas.

Na verdade, no libc existe uma estrutura de dados que se chama task e é usada justamente para isto. Mas em termos de escalonamento, podemos chamar de "thread" de modo a simplificar

Até agora falamos apenas de CPU single-core. Mas todos sabemos que, a partir dos anos 2000, tivemos um aumento exponencial do uso de multi-core. Cada vez mais as CPU's são projetadas para terem mais de um núcleo de execução.

O que muda no nosso modelo de concorrência? De forma simplista, nada. Mas se pensarmos que agora temos mais de um núcleo de execução, podemos PARALELIZAR a exeução de diferentes processos e threads consoante ao número de núcleos disponíveis.

PreviousClone leve de processo (thread)NextUma nota sobre paralelismo

Last updated 5 months ago