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

First things first

Muito do que vou trazer ao longo deste guia é um compilado de coisas que aprendi ao longo da carreira, tanto a nível acadêmico quanto profissional. Tem muito conhecimento teórico pra compartilhar aqui, mas também muito empirismo.

Pegue minha visão com a devida moderação, e fique a vontade pra discordar de alguns pontos e me chamar pra conversar sobre

Primeira coisa: acho confuso falar de concorrência iniciando logo por threads. Isto geralmente vem acompanhado de "multi-threading", "paralelismo" e também em como deixar o sistema "mais rápido". Na carona vem palavrinhas que causam boa impressão como escalabilidade e performance.

Vamos com calma. Existem muitas camadas anteriores que é preciso sabermos.

"Ah mas certas coisas não vão ajudar no dia-dia, nem vão pagar meus boletos"

Wrong. Vão ajudar sim. Não estou propondo alto conhecimento acadêmico e teórico, mas reflexões que vão te ajudar a, perdoem a analogia, apertar aquele parafuso de forma eficiente quando ninguém mais na equipe conseguir apertar.

E atenção para quando eu digo "eficiente": eficiente é o contrário de caro e complexo. Por vezes a gente acaba pensando numa solução que dá uma tremenda volta sendo que era só "apertar o parafuso". Abordagens como "é só colocar mais thread que fica mais rápido" acabam penalizando e muito a performance sem antes tomar a decisão, cientes das limitações da linguagem de programação, do framework, e inclusive do próprio sistema operacional.

E é por isso que resolvi escrever este guia.

Ok, mas de qual sistema operacional estamos falando?

Quando o assunto é sistemas operacionais, diferentes implementações podem trazer diferentes conceitos, o que pode tornar o assunto impreciso. Por este motivo, é importante estabelecermos qual sistema operacional este guia abordará, e não só: a arquitetura do computador também.

Neste guia abordaremos mais precisamente conceitos da arquitetura x86_64 e sistema operacional UNIX-like, podendo ser qualquer distribuição GNU/Linux ou MacOS, por exemplo.

PreviousIntroduçãoNextAgradecimentos

Last updated 4 months ago