Camada Zero · 16 · Syscalls & a Fronteira User/Kernel
Seu programa não toca o disco, a rede nem o hardware direto. Ele pede pro kernel, e esse pedido cruza uma fronteira que custa caro. Faz uma syscall aqui embaixo e vê o pedido atravessar. Depois lê o mesmo arquivo com e sem buffer e olha a contagem de syscalls disparar.
Clica em "fazer 1 syscall" e vê o pedido descer pro kernel, fazer o trabalho privilegiado e voltar. Cada ida e volta cruza a fronteira duas vezes.
user spacekernel spacefronteira (mode switch)o pedido
O hardware tem dois modos: user (sem privilégio) e kernel (privilegiado). Seu código roda em user mode e não pode falar com disco, rede ou a memória de outro processo direto. Pra isso ele faz uma syscall, que é o portão controlado pro kernel agir por ele. Cruzar essa fronteira custa: salva estado, troca de modo, valida, executa, volta. Ordens de grandeza acima de uma chamada de função comum.
funccomBuffer(f *os.File) {
r := bufio.NewReader(f) // lê em blocos de 4096for {
_, err := r.ReadByte() // syscall só quando o buffer esvaziaif err != nil { break }
}
}
Syscall bloqueante no runtime Go
// A goroutine bloqueia no kernel, mas o runtime// entrega o P (processador) a outra M (thread),// então as outras goroutines seguem rodando.
n, err := conn.Read(buf) // não congela o programa inteiro
🧠 Desafio — Syscalls
Faz uma syscall e roda os dois modos de leitura aqui de cima antes de responder. As duas últimas são de reflexão: escreve a sua e só então revela o modelo.