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

U1 · Estrutura do sistema operacional e chamadas de sistema

O núcleo por dentro — monolítico, microkernel e camadas — e a chamada de sistema, a única porta pela qual um programa alcança o hardware.

📚 Sistemas Operacionais🧪 2 simulador(es)📝 mini-quiz ao final
Objetivos da aula

O que você vai aprender

1

Caracterizar o núcleo e o que o torna privilegiado.

2

Comparar as arquiteturas monolítica, microkernel e em camadas.

3

Descrever o percurso completo de uma chamada de sistema.

4

Estimar o custo de uma travessia usuário-núcleo e suas consequências de projeto.

1 · Motivação

Seu programa não pode tocar no disco

Escreva printf("oi") e o texto aparece na tela. Mas o seu programa não tem permissão para falar com a placa de vídeo. Nenhum programa de usuário tem.

Entre a sua linha de código e o hardware existe uma fronteira vigiada pelo próprio processador. Atravessá-la tem um nome, um custo e um mecanismo — e é isso que dá ao sistema operacional o poder de ser árbitro em vez de mera biblioteca.

2 · Mapa

Roteiro da aula

1 O que é o núcleo e por que ele é privilegiado
2 Como o núcleo pode ser organizado por dentro
3 A chamada de sistema: a porta oficial
4 Simulador: atravesse a fronteira passo a passo
3 · Conceito

O kernel

Kernel. Núcleo do SO que executa em modo privilegiado, com acesso direto ao hardware. Gerencia processos, memória, E/S e a comunicação entre eles.

Tudo o que exige privilégio passa pelo kernel: programar o controlador de disco, alterar a tabela de páginas, mascarar interrupções. Bibliotecas e aplicativos ficam em modo usuário e dependem do kernel para essas operações.

4 · Explicação

Estruturas de kernel

Há várias formas de organizar o código do kernel, com diferentes trade-offs entre desempenho e robustez:

EstruturaIdeiaTrade-off
MonolíticoTudo em um grande kernelRápido, porém menos isolado (Linux)
MicrokernelMínimo no núcleo; serviços em modo usuárioRobusto, porém com overhead de mensagens
HíbridoMistura dos doisEquilíbrio (Windows NT, macOS)
💡
Em RTOS embarcados é comum não haver separação usuário/núcleo: tudo roda em modo privilegiado para reduzir overhead, ao custo de menos isolamento.
5 · Exemplo

Monolítico vs. microkernel na falha de um driver

CenárioMonolíticoMicrokernel
Driver de rede travaPode derrubar o kernel inteiroÉ só um processo de usuário: pode reiniciar isolado
Chamar o driverFunção direta (rápido)Troca de mensagens (mais lento)
Adicionar driverMódulo no kernelNovo servidor em modo usuário

É por isso que sistemas críticos (aviônica, automotivo) frequentemente preferem microkernels: o isolamento contém falhas.

6 · Conceito

Chamada de sistema: a única porta

Chamada de sistema (syscall). Pedido formal de um programa em modo usuário para que o núcleo execute uma operação privilegiada em seu nome.
Trap. A instrução que provoca, de propósito, a mudança para modo núcleo — syscall no x86-64, svc no ARM.

Repare no detalhe decisivo: o programa não escolhe para onde o processador salta. O endereço de entrada foi configurado pelo núcleo durante o boot. O programa só consegue dizer o quê quer, nunca onde ir. É essa assimetria que torna a proteção possível.

7 · Explicação

Chamada de biblioteca não é chamada de sistema

Confusão clássica. Quando você escreve printf, chama uma função da biblioteca C — código comum, em modo usuário. Ela formata o texto e, só quando o buffer enche ou você pede, executa write(), essa sim uma chamada de sistema.

Chamada de bibliotecaChamada de sistema
Onde rodaModo usuárioModo núcleo
Troca de modoNãoSim
Custo típicoNanossegundosCentenas de nanossegundos a microssegundos
Exemploprintf, mallocwrite, fork, open
💡
É justamente por a travessia ser cara que a biblioteca acumula texto num buffer: uma write() com 4 KB custa quase o mesmo que uma com 1 byte. Agrupar é a otimização.
8 · Exemplo

O mesmo trabalho, dois custos

// versão ingênua: uma syscall por caractere for (i = 0; i < 4096; i++) write(1, &buf[i], 1); // 4096 travessias × ~150 µs // versão correta: uma syscall só write(1, buf, 4096); // 1 travessia × ~180 µs

Mesmo resultado na tela. A primeira versão gasta cerca de 600 ms; a segunda, 0,18 ms — mais de três mil vezes mais rápida, sem mudar uma linha de lógica. O custo não está no trabalho, está na fronteira.

🔬
Este número não precisa ficar no campo da crença: a aba o preço da fronteira, na bancada acima, traz a medição feita em uma máquina real — 1 MiB entregue em blocos de 1 byte contra blocos de 64 KiB, com o programa, a máquina e a data declarados.
9 · Interativo

Passo a passo: uma write() do início ao fim

Passo 1
O programa chama write(fd, buf, 4096) — ainda é código de biblioteca, em modo usuário.
Passo 2
A biblioteca coloca o número da chamada num registrador e executa a instrução de trap.
Passo 3
O hardware muda para modo núcleo e desvia para o ponto de entrada que o SO fixou no boot.
Passo 4
O núcleo confere: esse descritor existe? está aberto para escrita? o ponteiro buf pertence mesmo a este processo?
Passo 5
Os dados são copiados para o cache do sistema de arquivos. O disco ainda não foi tocado.
Passo 6
A CPU volta ao modo usuário e o programa segue. A gravação física acontecerá depois, em segundo plano.
⚠️
O passo 6 explica por que write() retornar com sucesso não significa que o dado está no disco. Para essa garantia é preciso fsync() — detalhe que reaparece na U8, ao estudarmos consistência e journaling.
10 · Interativo

Atravesse a fronteira você mesmo

No simulador abaixo, escolha uma chamada e avance passo a passo. Acompanhe em qual modo o processador está a cada instante. A última opção é uma instrução privilegiada executada na marra: veja o que o hardware faz com ela.

11 · Flashcards

Revisão relâmpago

Kernelvirar
A parte do SO que roda em modo privilegiado e controla o acesso ao hardware.
Monolíticovirar
Todos os serviços dentro do núcleo: rápido, porém um driver com defeito derruba o sistema.
Microkernelvirar
Núcleo mínimo; serviços em modo usuário. Isola falhas ao custo de mais trocas de mensagem.
Chamada de sistemavirar
Pedido formal ao núcleo para executar uma operação privilegiada.
Trapvirar
Instrução que provoca de propósito a mudança para modo núcleo, num ponto de entrada fixo.
12 · Interativo

Verifique seu entendimento

Um programa acessa um endereço de memória cuja página não está na RAM. Que tipo de evento ocorre?

A falta de página é causada pela própria instrução de acesso — é síncrona. O SO a trata trazendo a página do disco.
13 · Erros comuns

Onde os alunos tropeçam

⚠️
Cuidado com:
• Chamar toda falha de "interrupção" — divisão por zero é exceção, não interrupção.
• Achar que a syscall é "uma função normal" — ela cruza a fronteira de privilégio via trap, com custo real.
• Escrever ISRs longas que bloqueiam outras interrupções e arruínam a latência de tempo real.
14 · Dicas

Boas práticas de E/S

Prefira E/S em lotes: ler 4 KB de uma vez com uma syscall é muito melhor que 4096 syscalls de 1 byte. Cada syscall paga o custo da troca de modo (salvar/restaurar contexto, possível perda de cache). Buffers existem justamente para amortizar esse custo.
15 · Interativo

Revele a resposta

Por que microkernels podem ser mais lentos que monolíticos?
Porque serviços que num kernel monolítico são simples chamadas de função, num microkernel viram troca de mensagens entre processos em modo usuário — cada mensagem exige cópias de dados e trocas de contexto/modo. Ganha-se isolamento e robustez, paga-se com overhead de comunicação.
16 · Conexões

Como isto se liga ao curso

Esta aula é a engrenagem central:

  • O timer que vimos na Aula 1 é a interrupção que viabiliza a preempção do escalonador (Aula 5).
  • A falta de página (exceção) é a base da memória virtual (Aulas 8–9).
  • As ISRs reaparecem nos drivers e na E/S por interrupção (Aula 10).
17 · Síntese

Resumo da aula

🔑
O núcleo é o único código privilegiado, e sua organização interna (monolítico, microkernel, camadas) é um trade-off entre desempenho e isolamento. Programas de usuário só alcançam o hardware pela porta da chamada de sistema, cuja travessia é controlada pelo hardware e tem custo mensurável — o que explica por que agrupar operações de E/S é a otimização mais rentável que existe.
Mão na massa · colaborativo

Atividade em grupo · Contando travessias

Em duplas, meçam quantas chamadas de sistema programas comuns realmente fazem.

⏱️ 25 min👥 duplas🧩 medição

Roteiro

  1. Executem strace -c ls e anotem o total de chamadas e as três mais frequentes.
  2. Repitam com strace -c ls -R /usr e comparem os números.
  3. Escrevam um programa que imprime 4096 caracteres um a um e outro que imprime tudo de uma vez; meçam ambos.
  4. Expliquem a diferença de tempo usando o conceito de custo de travessia.
Operadorroda os comandos e coleta os números
Programadorescreve as duas versões do programa
Relatorredige a explicação da diferença
📤 Entrega: Tabela comparativa das medições e um parágrafo explicando por que agrupar E/S compensa.
Teste seu conhecimento

Mini-quiz · Aula 3

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

0/20

📌 Resumo — leve isto para a prova

  • O núcleo é a única parte do sistema que roda em modo privilegiado.
  • Monolítico troca isolamento por desempenho; microkernel faz o inverso.
  • A chamada de sistema é a única porta oficial, e quem define o ponto de entrada é o núcleo, não o programa.
  • Chamada de biblioteca roda em modo usuário; chamada de sistema atravessa a fronteira e custa muito mais.
  • Agrupar operações de E/S é a otimização mais rentável justamente porque a travessia é o caro.