


















Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Este guia detalhado explora os conceitos de processos, threads e gerenciamento de memória, oferecendo uma análise aprofundada com exemplos didáticos. Ele aborda desde os fundamentos de processos e threads, como definições e diferenças, até tópicos avançados como paralelismo, concorrência, ciclo de vida das threads e sincronização com mutex. Além disso, o material explora o gerenciamento de memória, crucial para o desempenho eficiente de aplicações. Ideal para estudantes e profissionais que buscam um entendimento completo e prático sobre o funcionamento interno dos sistemas computacionais, este guia oferece uma base sólida para o desenvolvimento de software otimizado e eficiente. O documento detalha a evolução histórica da proteção de memória e as vantagens da utilização de threads para otimizar recursos e melhorar a performance.
Tipologia: Exercícios
1 / 26
Esta página não é visível na pré-visualização
Não perca as partes importantes!



















Material de Estudo Uni cado com Exemplos Didáticos
1.1 O Que é um Processo?
Antes de entender threads e gerenciamento de memória, você precisa saber o que é um processo.
Um processo é:
Uma instância de um programa em execução Possui seu próprio espaço de memória independente Tem seus próprios registradores, variáveis e recursos É como se fosse um "mundo isolado"
Exemplo visual:
PROCESSO = Programa em execução isolado
Processo Google Chrome: ├─ Memória própria: 500 MB ├─ Registradores próprios ├─ Arquivos abertos: cookies, cache └─ Completamente separado de outros processos
1.2 O Que é uma Thread?
Uma thread é:
Um caminho de execução dentro de um processo Compartilha a mesma memória do processo pai Muito mais "leve" que um processo (por isso chamada de processo leve )
Múltiplas threads podem executar dentro do mesmo processo
Visualização:
PROCESSO CHROME (o "mundo") ├─ Espaço de memória compartilhado: 500 MB │ ├─ Thread 1: Renderiza páginas web │ └─ Stack próprio: 1 MB │ ├─ Thread 2: Baixa arquivos │ └─ Stack próprio: 1 MB │ └─ Thread 3: Executa JavaScript └─ Stack próprio: 1 MB
Total usado: 503 MB (muito menos que 3 processos separados!)
Threads compartilham:
Código do programa Dados globais (variáveis compartilhadas) Arquivos abertos Sinais e conexões de rede
Mas cada thread tem seu próprio:
Stack (pilha de execução) - área de memória exclusiva Registradores Program Counter (PC) - indica onde está no código Estado de execução
2.1 Sistema Single-Core (Concorrência)
"Em um single-core, as threads executam alternadamente (time-sharing). CPU Única, com Multiprogramação. Múltiplas tarefas ALTERNANDO rapidamente. Parece simultâneo, mas NÃO É!"
Exemplo didático - Garçom único:
🕐 15:00 - Atende Mesa 1 (Thread 1) 🕐 15:01 - Atende Mesa 2 (Thread 2) 🕐 15:02 - Atende Mesa 3 (Thread 3)
Exemplo prático - Servidor Web:
SEM THREADS (Sequencial):
Thread 1: Atende Cliente 1 → Lê arquivo → Envia resposta (3s) DEPOIS Atende Cliente 2 → Busca BD → Envia resposta (2s) DEPOIS Atende Cliente 3 → Processa imagem → Envia resposta (4s)
TEMPO TOTAL: 9 segundos ❌
COM THREADS (Paralelo em multi-core):
Thread 1: Atende Cliente 1 → Lê arquivo → Envia resposta (3s) Thread 2: Atende Cliente 2 → Busca BD → Envia resposta (2s) ← AO MESMO TEMPO Thread 3: Atende Cliente 3 → Processa imagem → Envia resposta (4s)
TEMPO TOTAL: 4 segundos ✅ (tempo da thread mais lenta)
SPEEDUP: 2.25x mais rápido!
3.2 Otimização de Recursos
Comparação visual - Uso de memória:
OPÇÃO 1: 3 PROCESSOS SEPARADOS
Processo Chrome 1: ├─ Memória: 200 MB ├─ Código: 50 MB ├─ Recursos: 30 MB └─ Total: 280 MB
Processo Chrome 2: ├─ Memória: 200 MB ├─ Código: 50 MB (DUPLICADO!) ├─ Recursos: 30 MB └─ Total: 280 MB
Processo Chrome 3: ├─ Memória: 200 MB ├─ Código: 50 MB (DUPLICADO!) ├─ Recursos: 30 MB └─ Total: 280 MB
CUSTO TOTAL: 840 MB ❌
Processo Chrome (compartilhado): ├─ Memória: 200 MB (COMPARTILHADA) ├─ Código: 50 MB (COMPARTILHADO) ├─ Recursos: 30 MB (COMPARTILHADOS) ├─ Thread 1: + 1 MB (stack próprio) ├─ Thread 2: + 1 MB (stack próprio) └─ Thread 3: + 1 MB (stack próprio)
CUSTO TOTAL: 283 MB ✅
ECONOMIA: ~66% menos memória!
Estados de uma Thread:
├─ Thread está executando na CPU └─ Processando instruções
← Stack independente do Funcionário 1
Funcionário 3 (Thread 3) - Executando JavaScript: 📔 SEU BLOCO DE NOTAS (STACK): Página 4: função alert() Página 3: função processar_evento() Página 2: função executar_script() Página 1: função iniciar_js() ← Stack próprio, não interfere com outros
Por que cada thread precisa de stack próprio?
Para não confundir as anotações (cada um sabe onde parou) Para permitir execução simultânea sem con itos Para manter variáveis locais independentes Para controlar chamadas de funções de forma isolada
6.1 Anos 1960-1970: O Caos Sem Proteção
"Antigamente a duplicação era comum, cada programa tinha sua cópia isolada."
"Um programa podia DESTRUIR, MODIFICAR ou CORROMPER os dados de outro programa!"
Exemplo do problema:
CENÁRIO ANOS 1960:
Programa A (Calculadora): ├─ Usa endereços: 1000- └─ Armazena resultado em 1500
Programa B (Editor): ├─ Deveria usar: 3000- └─ MAS hardware não impede acesso!
PROBLEMA:
CAUSA: Hardware não tinha proteção de memória!
Por que acontecia:
HARDWARE PRIMITIVO: ❌ Sem MMU (Memory Management Unit) ❌ Sem endereços virtuais ❌ Sem proteção de memória ❌ Qualquer programa acessava qualquer endereço
6.2 Anos 1980-1990: Compartilhamento Controlado
Solução moderna: Threads com proteção
HOJE: Compartilhamento SEGURO
Processo Chrome: ├─ Endereços virtuais protegidos pela MMU ├─ Thread 1, 2, 3: compartilham memória COM SEGURANÇA └─ Outros processos NÃO conseguem acessar!
Processo Word: ├─ Endereços virtuais SEPARADOS do Chrome └─ Isolamento total entre processos ✅
RESULTADO: ✅ Threads compartilham dentro do processo ✅ Processos são isolados entre si
7.1 O Problema: Race Condition
Exemplo didático - Contador compartilhado:
CENÁRIO: 2 threads incrementando contador
contador = 0
Importante: O programador DEVE implementar mutex manualmente no código! Não é automático!
PARTE II: GERENCIAMENTO DE MEMÓRIA
Como threads e gerenciamento de memória se relacionam:
FATO FUNDAMENTAL: Todas as threads de um processo COMPARTILHAM o mesmo espaço de memória
├─ Threads acessam os mesmos dados na RAM ├─ Mais threads = mais pressão sobre a memória ├─ Mais threads = mais page faults potenciais └─ Gerenciamento eficiente é CRUCIAL!
EXEMPLO: Processo Chrome com 10 threads: ├─ Todas acessam os mesmos 500 MB de RAM ├─ Todas competem pelos mesmos frames └─ Sistema precisa gerenciar acesso de todas
9.1 O Problema
Como executar programa de 12 GB em computador com 8 GB de RAM?
CENÁRIO IMPOSSÍVEL (sem memória virtual): ├─ Programa: 12 GB ├─ RAM disponível: 8 GB └─ Resultado: "Memória insuficiente" ❌
CENÁRIO POSSÍVEL (com memória virtual): ├─ Programa: 12 GB ├─ RAM disponível: 8 GB ├─ Disco usado como extensão: 4 GB └─ Resultado: Programa executa! ✅
9.2 Analogia Didática: Mesa e Estante
"Imagine que seu cérebro (CPU) quer lembrar de algo guardado na sua mesa (RAM): Ele procura e... não está lá! Tem que levantar, buscar na estante (HD/SSD) e trazer para a mesa. Esse 'levantar e buscar' leva tempo — é o que causa a lentidão."
VOCÊ = CPU MESA = RAM (8 GB) - espaço limitado ESTANTE = DISCO (1 TB) - espaço grande mas lento
CENÁRIO: Estudar 100 livros
SEM MEMÓRIA VIRTUAL: ❌ Mesa cabe 10 livros ❌ "Não consigo estudar os outros 90" ❌ Tarefa impossível
COM MEMÓRIA VIRTUAL: ✅ Coloca 10 livros na mesa (mais importantes) ✅ Outros 90 ficam na estante ✅ Quando precisa do livro 11:
CUSTO: Ir à estante é 100.000x mais lento que pegar da mesa
9.3 Como Funciona Tecnicamente
Programa de 12 GB rodando em RAM de 8 GB: