LRM Prof. Mantovani ← Aulas da disciplina
Semana 4 · Aula 4 de 14

Threads e concorrência

Threads como fluxos de execução dentro de um processo: o que compartilham, tipos (usuário e núcleo), modelos de multithreading e a diferença entre concorrência e paralelismo.

📚 Sistemas Operacionais📝 mini-quiz ao final
Objetivos da aula

O que você vai aprender

1

Definir thread e distingui-la de processo.

2

Comparar threads de usuário e de núcleo e os modelos de mapeamento.

3

Diferenciar concorrência de paralelismo.

4

Reconhecer vantagens, riscos e usos das threads.

1 · Motivação

Por que dividir um processo em threads?

Um navegador precisa renderizar a página, baixar imagens e responder ao seu clique ao mesmo tempo. Criar um processo separado para cada tarefa seria caro. A solução são as threads: vários fluxos de execução dentro de um mesmo processo.

Threads são mais leves que processos, compartilham dados facilmente e aproveitam máquinas com vários núcleos. Mas esse compartilhamento traz riscos que prepararão o terreno para a sincronização (Aula 7).

2 · Mapa

O que veremos nesta aula

Thread
vs processo
O que se
compartilha
Usuário ×
núcleo
Concorrência ×
paralelismo
💡
Ideia central: threads de um mesmo processo compartilham código, dados e arquivos, mas cada uma tem pilha e registradores próprios.
3 · Conceito

O que é uma thread

Thread. Unidade básica de execução dentro de um processo. Threads do mesmo processo compartilham código, dados e arquivos, mas têm pilha e registradores próprios.
4 · Conceito

O que é compartilhado e o que é privado

Compartilhado entre threadsPrivado de cada thread
Código, dados globais e heapPilha de execução
Arquivos abertosRegistradores e contador de programa
Espaço de endereçamentoEstado/contexto da thread

É justamente o compartilhamento do heap e dos dados globais que torna a comunicação entre threads fácil — e que exige cuidado com sincronização.

5 · Exemplo

Threads num servidor web

// servidor que atende cada cliente com uma thread enquanto (verdadeiro) { conexao = aceitar(); // nova conexão criar_thread(atender, conexao); // thread por cliente } // todas as threads compartilham o cache e a configuração, // mas cada uma tem sua pilha (dados da conexão atual).
6 · Interativo

Stepper: criar processo × criar thread

Passo 1
Criar um processo exige copiar/configurar um novo espaço de endereçamento — caro.
Passo 2
Criar uma thread só aloca uma nova pilha e contexto dentro do processo já existente — barato.
Passo 3
Por isso threads são preferidas quando as tarefas precisam compartilhar muitos dados.
7 · Conceito

Threads de usuário e de núcleo

Thread de usuário. Gerenciada por uma biblioteca, sem o kernel saber. Rápida de trocar, mas se uma bloqueia, todas podem bloquear.
Thread de núcleo. Gerenciada pelo SO, que pode escaloná-la em vários núcleos.
8 · Conceito

Modelos de multithreading

Os modelos mapeiam threads de usuário em threads de núcleo:

ModeloMapeamentoCaracterística
Muitos-para-umVárias de usuário → 1 de núcleoRápido, mas sem paralelismo real; um bloqueio trava todas
Um-para-umCada de usuário → 1 de núcleoParalelismo real; mais custo por thread
Muitos-para-muitosVárias de usuário → várias de núcleoFlexível; equilibra custo e paralelismo
9 · Analogia

Cozinha com vários cozinheiros

👨‍🍳 Analogia
Um processo é uma cozinha (espaço, ingredientes, fogões compartilhados). As threads são os cozinheiros: usam os mesmos ingredientes e fogões (dados e código compartilhados), mas cada um tem sua bancada e suas mãos (pilha e registradores). Por isso é rápido coordenar — e por isso podem brigar pela mesma panela (condição de corrida).
10 · Comparação

Concorrência × paralelismo

Concorrência. Várias tarefas em progresso ao mesmo tempo (podem alternar em um único núcleo).
Paralelismo. Várias tarefas executando simultaneamente em núcleos diferentes.
ConcorrênciaParalelismo
Núcleos necessáriosUm já bastaVários
ExecuçãoAlternada (intercalada)Realmente simultânea
11 · Flow

Da tarefa única às threads

1 processo,
1 fluxo
1 processo,
N threads
Threads em
N núcleos
Paralelismo
real

O salto para o paralelismo real só acontece quando há threads de núcleo e múltiplos núcleos disponíveis.

12 · Aprofundamento

Vantagens e riscos

Vantagens: criação mais leve que processos, compartilhamento fácil de dados, melhor resposta (uma thread atende a UI enquanto outra calcula) e uso de múltiplos núcleos.
⚠️
Riscos: como compartilham dados, threads podem provocar condições de corrida se acessarem o mesmo dado sem sincronização — assunto da Aula 7.
13 · Interativo

Verifique: concorrência vs paralelismo

Em uma CPU de um único núcleo rodando 3 threads, temos:

Com um único núcleo as threads se alternam: há concorrência, mas não paralelismo de verdade.
14 · Caso prático

Threads no editor de texto

Um editor moderno usa threads para tarefas paralelas:

  • Uma thread responde ao que você digita (UI sempre fluida).
  • Outra faz a verificação ortográfica em segundo plano.
  • Outra salva automaticamente (autosave) sem travar a digitação.

Todas compartilham o documento aberto (dados globais), mas cada uma tem seu fluxo próprio.

15 · Erros comuns

Confusões frequentes

⚠️
Cuidado:
• Threads não têm pilha compartilhada — a pilha é privada de cada uma.
• Concorrência não implica paralelismo: pode haver concorrência com um núcleo só.
• Threads de usuário puras não dão paralelismo real se mapeiam em uma única thread de núcleo.
16 · Dicas

Quando usar threads

Dicas:
• Use threads quando as tarefas compartilham muitos dados; use processos quando precisar de forte isolamento.
• Tarefas limitadas por E/S se beneficiam de concorrência mesmo com um núcleo.
• Tarefas limitadas por CPU se beneficiam de paralelismo (vários núcleos).
17 · Interativo

Revele: bloqueio em threads de usuário

Por que, em threads de usuário puras, uma chamada bloqueante de E/S pode travar todas as threads do processo?
Porque o kernel não enxerga as threads individualmente — ele só vê o processo. Quando uma thread faz uma chamada bloqueante, o kernel bloqueia o processo inteiro, sem saber que existem outras threads prontas para rodar. No modelo um-para-um, cada thread tem sua thread de núcleo, então o kernel bloqueia apenas a que pediu E/S.
18 · Flashcards

Revisão relâmpago

Threadvirar
Fluxo de execução dentro de um processo; pilha e registradores próprios.
Compartilhado entre threadsvirar
Código, dados globais, heap e arquivos abertos.
Um-para-umvirar
Cada thread de usuário mapeia em uma thread de núcleo; permite paralelismo.
Paralelismovirar
Execução simultânea real em múltiplos núcleos.
19 · Conexões

Para onde isto leva

  • Quem escalona as threads de núcleo → Aula 5.
  • Corridas no acesso a dados compartilhados → Aula 7 (sincronização).
  • Threads que cooperam por dados → Aula 6 (memória compartilhada).
  • Base de processos → Aula 3.
20 · Síntese

Fechando a aula

🔑
Em uma frase: threads são fluxos leves dentro de um processo que compartilham dados, mas têm pilha própria; o mapeamento usuário↔núcleo decide o paralelismo, e concorrência (progresso intercalado) não é o mesmo que paralelismo (execução simultânea real).
Mão na massa · colaborativo

Atividade em grupo · Threads no editor de texto

Em duplas, identifiquem oportunidades de threads em um aplicativo real.

⏱️ 20 min👥 duplas🧩 estudo de caso

Roteiro

  1. Tomem um editor de texto ou navegador.
  2. Listem 3 tarefas que poderiam rodar em threads separadas (ex.: verificação ortográfica, autosave, renderização).
  3. Indiquem o que essas threads compartilhariam e o que seria privado.
  4. Discutam se ganhariam com paralelismo real em uma máquina multicore.
Arquiteto de threadspropõe a divisão
Analista de recursossepara compartilhado de privado
📤 Entrega: Lista de 3 threads com o que cada uma compartilha e o que é privado.
Teste seu conhecimento

Mini-quiz · Aula 4

20 questões sobre esta aula. Escolha e veja a explicação na hora.

0/20

📌 Resumo — leve isto para a prova

  • Thread é a unidade de execução; threads compartilham código/dados/heap, mas têm pilha própria.
  • Criar threads é mais barato que criar processos e facilita compartilhar dados.
  • Threads de usuário são leves; threads de núcleo podem usar vários núcleos.
  • Modelos: muitos-para-um, um-para-um e muitos-para-muitos.
  • Concorrência é progresso intercalado; paralelismo é execução simultânea real (exige múltiplos núcleos).