Cheatsheet · 1 página A4 · Trilha 3 · Máquina por Baixo (arquitetura + SO)
3trilha

Máquina por Baixo (Arquitetura + SO)

Folha de revisão · 5 aulas · o hardware que o Big-O esconde
Camada Zero
Hierarquia de memórians → ms
Cada nível é ~10–100x mais lento que o de cima: L1 ~1ns, RAM ~100ns, SSD ~100us, disco ~10ms. O dado certo no lugar errado custa ordens de grandeza.
// L1 1ns · RAM 100ns · SSD 100us · disco 10ms
Cache line & localidade64 bytes
A CPU não busca 1 byte: traz uma linha de 64B inteira. Acessar dados vizinhos é quase grátis (localidade espacial); pular pela memória paga miss toda hora.
Row-major & ordem do loop10x
Matriz fica linha a linha na memória. Iterar na ordem certa (linha, depois coluna) reusa a cache line; trocar a ordem dos loops pode custar 10x sem mudar o Big-O.
for i { for j { m[i][j] } } // certo
Pilha vs heapalocação
Pilha é bump de ponteiro e morre no fim da função: barata e automática. Heap precisa do alocador e do GC, vive além do escopo: flexível e mais cara.
Escape analysis (Go)stack quando dá
O compilador decide pilha vs heap: se o valor não escapa da função, fica na pilha. Devolver ponteiro pra local força o escape pro heap.
go build -gcflags=-m // vê o que escapou
Stack overflowlimite da pilha
A pilha tem tamanho fixo por thread. Recursão sem caso-base ou frames gigantes estouram o limite: o erro não é do algoritmo, é da pilha cheia.
Memória virtualpage table
Cada processo vê um espaço próprio e contínuo. A page table traduz endereço virtual para físico em páginas de ~4KB, isolando processos e mentindo sobre o layout real.
Page fault & TLBmiss caro
A TLB é o cache das traduções; hit é rápido. Miss ou página fora da RAM gera page fault: o SO entra, busca em disco e o acesso vira ms em vez de ns.
Processo · thread · goroutineisolamento
Processo tem memória própria (isolado, caro). Threads dividem a memória do processo. Goroutine é mais leve: o runtime multiplexa milhares sobre poucas threads.
Context switch~1–10us + cache frio
Trocar de thread salva e restaura registradores (~1–10us) e ainda esfria a cache: o próximo trabalho começa pagando misses. Concorrência demais vira overhead.
Syscall & fronteira user/kerneltransição
Ler arquivo, abrir socket, alocar: tudo passa por syscall, que cruza pro kernel. A transição tem custo fixo, então a conta não é o trabalho, é o número de travessias.
read() · write() · mmap() // modo kernel
Bufferingmenos syscalls
Escrever byte a byte é uma syscall por byte. O buffer junta tudo e descarrega de uma vez: mesma quantidade de dados, ordens de grandeza menos travessias pro kernel.
bufio.NewWriter(f) // agrupa writes
Camada Zero · cheatsheet · Trilha 3 · Máquina por Baixo camadazero · fundamentos para quem programa com IA