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

Threads e concorrência

Threads de usuário e de núcleo, a distinção entre concorrência e paralelismo e como o multicore muda o jogo.

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

O que você vai aprender

1

Diferenciar processos e threads.

2

Comparar threads de usuário e de núcleo.

3

Distinguir concorrência de paralelismo em hardware multicore.

4

Aplicar a Lei de Amdahl para estimar ganhos.

1 · Motivação

Um processo, várias frentes de trabalho

Um servidor web atende milhares de clientes; um jogo calcula física, IA e som ao mesmo tempo. Criar um processo inteiro para cada tarefa seria caro — cada um com seu espaço de endereçamento e PCB pesado.

As threads resolvem isso: vários fluxos de execução dentro de um mesmo processo, compartilhando memória, mais leves de criar e trocar. E com multicore, podem rodar de fato em paralelo.

2 · Mapa

Roteiro da aula

ThreadsUsuário ×
núcleo
Concorrência ×
paralelismo
Lei de
Amdahl

Definiremos thread, compararemos os modelos de implementação e separaremos dois conceitos sempre confundidos: concorrência e paralelismo.

3 · Conceito

O que é uma thread

Thread. Fluxo de execução dentro de um processo. Threads do mesmo processo compartilham código, dados e arquivos abertos, mas têm pilha e registradores próprios.
4 · Explicação

O que é compartilhado e o que é privado

A divisão entre compartilhado e privado é o coração das threads:

  • Compartilhado entre as threads: o código, os dados globais e a heap, os arquivos abertos, o espaço de endereçamento.
  • Privado de cada thread: a pilha (variáveis locais e chamadas), os registradores e o contador de programa.

Esse compartilhamento é o que torna threads poderosas (comunicação por memória, sem cópias) e perigosas (condições de corrida — tema da Aula 6).

5 · Exemplo

Processo vs. thread em números

AspectoProcessoThread
Espaço de endereçamentoPróprioCompartilhado
Custo de criaçãoAltoBaixo
Custo de trocaAlto (esfria TLB)Menor (mesma TLB)
ComunicaçãoIPC (pipes, mensagens)Memória compartilhada direta
IsolamentoForteFraco (uma derruba o processo)
6 · Interativo

Passo a passo: somando um vetor com threads

Passo 1
Divide-se o vetor em 4 fatias de 250 mil elementos.
Passo 2
Criam-se 4 threads, cada uma somando sua fatia (resultado parcial privado).
Passo 3
Com 4 cores, as 4 threads executam em paralelo de verdade.
Passo 4
Ao terminar, somam-se os 4 parciais (parte sequencial).
Passo 5
O ganho ideal seria 4×, mas a junção sequencial e a sincronização o reduzem.
7 · Conceito

Threads de usuário e de núcleo

Thread de usuário. Gerenciada por uma biblioteca em modo usuário, sem o kernel saber de sua existência.
Thread de núcleo. Conhecida e escalonada pelo próprio SO, mapeável a cores físicos.
8 · Explicação

Implicações de cada modelo

UsuárioNúcleo
Quem gerenciaBiblioteca, sem o SO saberO próprio SO
TrocaRápida (sem syscall)Mais cara (entra no kernel)
Bloqueio em E/SBloqueia todo o processoBloqueia só a thread
Paralelismo realNão (1 core por processo)Sim (mapeáveis a vários cores)
💡
Modelos de mapeamento: muitos-para-um, um-para-um e muitos-para-muitos. Sistemas modernos favorecem um-para-um (cada thread de usuário tem uma de núcleo).
9 · Analogia

O escritório e os funcionários

👥 Analogia
O processo é o escritório, com seus arquivos compartilhados (memória global). As threads são os funcionários: cada um tem sua mesa (pilha) e seu bloco de anotações (registradores), mas todos consultam os mesmos arquivos da empresa. Se um funcionário rasga um documento enquanto outro o lê, vira confusão — eis a condição de corrida.
10 · Comparação

Concorrência vs. paralelismo

AspectoConcorrênciaParalelismo
DefiniçãoTarefas em progresso no mesmo intervaloTarefas executando ao mesmo tempo
Hardware mínimo1 core (intercalado)Múltiplos cores
NaturezaEstrutural (como organizar)De execução (simultaneidade real)
ExemploMultitarefa num core4 threads em 4 cores
Concorrência. Várias tarefas em progresso no mesmo intervalo.
Paralelismo. Várias tarefas executando ao mesmo tempo, em cores diferentes.
11 · Fluxo

De concorrência a paralelismo

Tarefas
concorrentes
Trabalho
divisível?
Mapear a
vários cores
Paralelismo
real
🔑
Concorrência é sobre estrutura; paralelismo é sobre execução simultânea. Em um único core há concorrência sem paralelismo; com multicore ganha-se paralelismo de verdade — desde que o trabalho seja divisível.
12 · Aprofundamento

A Lei de Amdahl

Lei de Amdahl. Se uma fração p do programa é paralelizável e (1−p) é sequencial, o ganho máximo com N cores é 1 / ((1−p) + p/N). Mesmo com infinitos cores, o teto é 1/(1−p).

Exemplo: se 90% paraleliza (p = 0,9), o ganho máximo é 1/(0,1) = 10×, por mais cores que se adicione. Se só 50% paraleliza, o teto é 2×. A parte sequencial é o gargalo — por isso reduzir a fração sequencial costuma render mais que somar cores.

13 · Interativo

Verifique seu entendimento

Com threads de usuário puras (muitos-para-um), uma chamada de E/S bloqueante de uma thread:

Como o SO enxerga só o processo, ele bloqueia tudo. Threads de núcleo (um-para-um) evitam isso bloqueando apenas a thread.
14 · Caso prático

Multicore embarcado: o ESP32

O microcontrolador ESP32, popular em IoT, traz dois núcleos. O FreeRTOS rodando nele permite fixar tarefas a um núcleo específico (afinidade): por exemplo, a pilha Wi-Fi em um core e a aplicação no outro, evitando que o rádio interfira nos prazos da aplicação.

É um exemplo concreto de paralelismo de verdade em embarcado: duas tarefas executam ao mesmo tempo, e a separação por core melhora o determinismo — concorrência transformada em paralelismo controlado.

15 · Erros comuns

Armadilhas conceituais

⚠️
Cuidado com:
• Tratar concorrência e paralelismo como sinônimos — um é estrutura, o outro é execução simultânea.
• Esperar ganho linear ao adicionar cores — Amdahl limita pelo trecho sequencial.
• Esquecer que memória compartilhada entre threads exige sincronização (Aula 6), ou surgem condições de corrida.
16 · Dicas

Quando vale paralelizar

Paralelize tarefas independentes e com bastante trabalho por unidade (granularidade grossa). Se as threads passam mais tempo sincronizando do que computando, o paralelismo perde sentido. Meça antes: nem toda tarefa se beneficia, e algumas até pioram com mais cores.
17 · Interativo

Revele o cálculo

Se 80% de um programa paraleliza, qual o ganho máximo com infinitos cores?
Pela Lei de Amdahl, o teto é 1/(1−p) = 1/(1−0,8) = 1/0,2 = . Ou seja, mesmo com milhares de cores, o programa nunca fica mais de 5 vezes mais rápido, porque 20% dele é sequencial.
18 · Flashcards

Revisão relâmpago

Threadvirar
Fluxo de execução dentro de um processo; pilha e registradores próprios, memória compartilhada.
Concorrênciavirar
Tarefas em progresso no mesmo intervalo (pode ser em 1 core).
Paralelismovirar
Tarefas executando ao mesmo tempo, em cores diferentes.
Lei de Amdahlvirar
O ganho é limitado pela fração sequencial; teto = 1/(1−p).
19 · Conexões

Para onde isto leva

As threads abrem caminho para:

  • A sincronização e as condições de corrida (Aula 6), inevitáveis com memória compartilhada.
  • O escalonamento de múltiplas threads em vários cores (Aula 5).
  • O custo de troca de contexto (Aula 3), do qual as threads se beneficiam por não esfriarem a TLB.
20 · Síntese

Resumo da aula

🔑
Threads compartilham o espaço do processo, com pilha e registradores próprios — mais leves que processos. Threads de núcleo permitem paralelismo real e bloqueio independente. Concorrência é estrutura; paralelismo é execução simultânea em multicore. A Lei de Amdahl limita o ganho pela fração sequencial. O compartilhamento de memória, porém, exige sincronização — nosso próximo grande tema.
Mão na massa · colaborativo

Atividade em grupo · Paralelizar ou não?

Em trios, avaliem quais tarefas ganham com paralelismo em hardware multicore.

⏱️ 25 min👥 trios🧩 análise

Roteiro

  1. Listem 4 tarefas: somar um vetor grande, ler um arquivo sequencial, renderizar quadros, atualizar uma variável compartilhada.
  2. Classifiquem cada uma: ganha com paralelismo? Por quê?
  3. Identifiquem onde a parte sequencial limita o ganho (Amdahl).
  4. Discutam o risco de condições de corrida na tarefa compartilhada.
Otimistadefende o paralelismo
Céticoaponta gargalos sequenciais
Árbitroconclui caso a caso
📤 Entrega: Tabela com 4 tarefas classificadas quanto ao ganho com multicore.
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

  • Threads compartilham o espaço do processo; têm pilha e registradores próprios.
  • Threads de núcleo permitem paralelismo real e bloqueio independente.
  • Concorrência é estrutura; paralelismo é execução simultânea em multicore.
  • A Lei de Amdahl limita o ganho pela fração sequencial (teto = 1/(1−p)).
  • Memória compartilhada exige sincronização para evitar condições de corrida.